Alterando o shell (usando chsh) através da linha de comando em um script


11

Em um script de inicialização que configura uma máquina, quero executar

chsh -s /bin/zsh

No entanto, isso solicita a senha do usuário. Como passo a senha como parâmetro? Ou se eu tenho poder sudo, posso de alguma forma ignorar esse passo? Ou, como alternativa, existe outra maneira de alterar o shell de inicialização padrão?

Respostas:


21

A seguir, evita-se que contas bloqueadas alterem suas conchas e, seletivamente, permite que as pessoas chshse usem SEM sudo ou su:

Configuração simples que ainda é segura:

  1. Adicione esta parte superior de /etc/pam.d/chsh:

    # This allows users of group chsh to change their shells without a password.
    #
    # Per: http://serverfault.com/questions/202468/changing-the-shell-using-chsh-via-the-command-line-in-a-script
    #
    auth       sufficient   pam_wheel.so trust group=chsh
    
  2. Crie o grupo chsh:

    groupadd chsh
    

Para qualquer usuário permitido alterar seu shell:

    usermod -a -G chsh username

Tiro de dinheiro:

user@host:~$ getent passwd $USER
user:x:1000:1001::/home/user:/bin/bash
user@host:~$ chsh -s `which zsh`
user@host:~$ getent passwd $USER
user:x:1000:1001::/home/user:/usr/bin/zsh
user@host:~$ 

Solução de trabalho, admira que isso ainda não seja aceito.
Dimpiax

Obrigado. Essa parece ser a maneira mais limpa de permitir que um usuário use o shell de mudança de autenticação somente por par de chaves sem o sudo. Esse material pam.d é muito interessante!
François Drolet

4

O chsh realmente altera a linha referente a um usuário em / etc / passwd, embora um usuário possa alterar apenas sua própria 'linha' em / etc / passwd. Portanto, se você quiser alterar o shell para outro usuário, precisará da senha dele.

Se você realmente deseja fazê-lo (dadas as preocupações do post de Lorenzo e possíveis preocupações de segurança), veja como se pode fazer isso:

#visudo

Isso requer privilégios de root.

Digamos que você esteja executando atualmente como "alice" e deseje alterar o shell "bob's" sem senha;

Adicione ao arquivo:

Cmnd_Alias     SHELL = /usr/bin/chsh
Runas_Alias    SH    = Bob
alice          ALL   = (SH) NOPASSWD: SHELL

Isso garante que 'alice' possa ser executado em todos os hosts como usuários do grupo SH sem uma senha do grupo de comandos no SHELL.

Provavelmente um pouco longe de fazer dessa maneira, mas é possível.

Certifique-se de ler "man sudoers" antes de alterar o arquivo sudores com 'visudo', especialmente as mensagens relacionadas à segurança!


O problema sudoé que é extremamente fácil burlar e enraizar um sistema. É melhor nunca mudar, a sudoersmenos que haja uma necessidade específica que não possa ser atendida de nenhuma outra maneira (executável setuid / setgid, permissões de grupo etc.).

2

Você precisa passar o nome de usuário; fazer isso via sudo(ou raiz) permitirá que você defina a senha / shell de um usuário sem ser solicitada a senha antiga. Por favor, verifique man chshpara mais informações.

Agora, minha pergunta é: por que você quer fazer isso? Se for um script de configuração, você não deve simplesmente alterar o shell dos usuários no momento da criação (por exemplo, ao iniciar adduser)? Se você estiver clonando um sistema remotamente, não deve alterá-lo /etc/passwdprimeiro? Não vejo motivos para fazê-lo por meio de um script, a menos que você automatize todo o processo de instalação e a seleção de shells a serem instalados venha após a criação do primeiro usuário.


É para uma máquina ec2 (o script que eu executo logo após a inicialização da máquina). Eu quero alterar o shell inicial padrão. Fazendo "sudo chsh -s / bin / zsh user_name" não quer trabalhar (ainda pede a senha do usuário)

tente usar um script e use #!/usr/bin/sudo -s(linha shebang). Além disso, você tem certeza de que o zsh está em / bin e talvez não em / usr / bin? (apenas verificando, eu não estou familiarizado com o EC2)
lorenzog

Esta resposta está incompleta porque assume sudopermissão. Veja o meu para uma abordagem diferente que não exige sudopara o usuário médio.


0

Tente sudo chsh -s /bin/zsh, então:

  1. sair para o servidor
  2. reiniciar o terminal
  3. faça o login no servidor e verifique echo $SHELL- caso seja bem-sucedido, ele mudou :)

Isso realmente definirá o zsh como terminal padrão para o usuário root.
Lcguida 08/09/19

@lcguida right.
Dimpiax #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.