Como passar a senha para su / sudo / ssh sem substituir o TTY?


148

Estou escrevendo um programa C Shell que estará fazendo suou sudoou ssh. Todos querem suas senhas na entrada do console (o TTY), em vez de stdin ou na linha de comando.

Alguém conhece uma solução?

A configuração sem senha sudonão é uma opção.

pode ser uma opção, mas não está presente no meu sistema simplificado.



Respostas:


215

Para sudo, existe uma opção -S para aceitar a senha da entrada padrão. Aqui está a entrada do homem:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Isso permitirá que você execute um comando como:

echo myPassword | sudo -S ls /tmp

Quanto ao ssh, fiz muitas tentativas para automatizar / script seu uso sem sucesso. Não parece haver nenhuma maneira incorporada de passar a senha para o comando sem avisar. Como outros já mencionaram, o utilitário " expect " parece ter como objetivo solucionar esse dilema, mas, em última análise, configurar a autorização correta de chave privada é o caminho correto a seguir ao tentar automatizar isso.


2
Felizmente, Ruby tem um cliente SSH embutido que permite especificar a senha. Você pode tentar ruby ​​-e "require 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | coloca 'Conectado com sucesso'; while cmd = gets; coloca ssh.exec! (cmd); end end "
user1158559 16/11

13
Eu odeio ser um desmancha prazeres aqui, mas fazer isso pode fazer com que sua senha seja exibida em uma lista de processos. Eu estava tentando determinar uma maneira melhor e me deparei com este artigo e fiquei surpreso que ninguém havia apontado isso. Ótima solução, mas cuidado com os riscos.
Matt

Sobre o ssh, você tentou passar a senha na cadeia de conexão? gosta nonroot:yourpassword@hostname.com? Obviamente, as coisas serão muito mais fáceis se você usar a autenticação de chaves e o gerenciador de chaves.
Killah

12
Evite que a senha apareça na lista de processos ou nos arquivos de log, colocando-a em um arquivo e usando cat; 'cat pw | sudo -S <command>e mais tarde rm pw.
CAB

Outra maneira seria usar o netcat e entregar a senha em um soquete - nc -l 12345 | sudo -S <command>. No lado de envio; echo myPassord | nc <target> 12345. Isso apenas move o problema de manipulação de senha, mas presumivelmente para um console mestre onde você tem mais opções.
CAB

36

Eu escrevi um Applescript que solicita uma senha por meio de uma caixa de diálogo e cria um comando personalizado do bash, assim:

echo <password> | sudo -S <command>

Não tenho certeza se isso ajuda.

Seria bom se o sudo aceitasse uma senha pré-criptografada, para que eu pudesse criptografá-la no meu script e não me preocupar em ecoar senhas de texto não criptografado. No entanto, isso funciona para mim e minha situação.


27

Para sshque você pode usar sshpass: sshpass -p yourpassphrase ssh user@host.

Você só precisa baixar o sshpass primeiro :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

Eu tenho:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Funciona para mim.


Não funcionou para mim. ainda ssh solicita a senha.
AKS

Excelente, finalmente, algo que eu possa usar! Obrigado. Eu uso isso dentro de um script bash que inicia uma sessão ssh e transmite comandos sudo para o cliente. Meu script tem linhas a vontade de: ssh -t username @ hostname do bash -c "sudo echo fartjuice"
James T Snell

12

Para o sudo, você também pode fazer isso:

sudo -S <<< "password" command

10

A solução usual para esse problema é configurar um aplicativo auxiliar que execute a tarefa que requer acesso de superusuário: http://en.wikipedia.org/wiki/Setuid

Sudo não é para ser usado offline.

Edição posterior: o SSH pode ser usado com autenticação de chave pública-privada. Se a chave privada não tiver uma senha, o ssh poderá ser usado sem solicitar uma senha.


10

Isso pode ser feito configurando chaves públicas / privadas nos hosts de destino aos quais você estará se conectando. A primeira etapa seria gerar uma chave ssh para o usuário executando o script no host local, executando:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Em seguida, digite uma senha em branco. Depois disso, copie sua chave ssh no host de destino ao qual você estará se conectando.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Depois de registrar as chaves ssh, você poderá executar um silêncio ssh remote_user@other_hostdo host local.


7

Talvez você possa usar um expectcomando ?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Esse comando fornece a senha automaticamente.


Parece bom, mas como posso ativar o comando expect em um maschine sem permissões de root?
Radon8472

1
@ Radon8472 Um executável pode ser adicionado ao ~ / bin se você não tiver permissões para instalá-lo. Se o seu sistema não adicionar automaticamente ~ / bin ao seu PATH, você poderá fazê-lo manualmente exportando PATH = "$ PATH: ~ / bin" ou adicione esse comando ao seu perfil para fazê-lo automaticamente. Se você não quiser alterar seu PATH, execute o comando usando seu caminho absoluto: ~ / bin / expect [argumentos] Lembre-se de definir seu bit executável: chmod + x ~ / bin / expect
StarCrashr

6

Quando não há melhor escolha (como sugerido por outros), o homem socat pode ajudar:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Toda a complexidade pty, setsid e ctty é necessária e, embora você não precise dormir por muito tempo, precisará dormir. A opção echo = 0 também vale uma olhada, assim como passar o comando remoto na linha de comando do ssh.


1
Isso realmente funcionará sutambém. sunão possui uma opção -S (stdin).
partir

É possível evitar dormir e usar algo mais confiável?
Michael Pankov

6

Dê uma olhada expect utilitário linux.

Ele permite enviar saída para o stdio com base na correspondência simples de padrões no stdin.


1

Configure o SSH para Autenticação de Chave Pública, sem uma senha na chave. Cargas de guias na rede. Você não precisará de uma senha para fazer login. Você pode limitar as conexões para uma chave com base no nome do host do cliente. Fornece segurança razoável e é excelente para logins automatizados.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Se você pode fazer login como usuário com chave ssh, para acesso sudo é bom: ssh user -t @ host "echo mypassword | sudo -S sudocommand"
Jack

0

Eu tive o mesmo problema. script de diálogo para criar diretório no PC remoto. diálogo com ssh é fácil. Eu uso o sshpass (instalado anteriormente).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

saudações da Alemanha

titus


0

Com base na resposta de @ Jahid, isso funcionou para mim no macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

uma sshpassalternativa melhor é:passh https://github.com/clarkwang/passh

Efetue login em um servidor remoto

 $ passh -p password ssh user@host

Execute um comando no servidor remoto

 $ passh -p password ssh user@host date

outros métodos para passar a senha

-p A senha (Padrão: `senha ')

-p env: lê a senha do env var

-p file: lê a senha do arquivo

aqui expliquei por que é melhor que o sshpass e outras soluções.


-1
echo <password> | su -c <command> <user> 

Isso está funcionando.


1
Este é o único que funciona para mim no Fedora. As pessoas votam negativamente nas respostas apenas porque não trabalham em sua situação?
Hangchen Yu

2
"su: deve ser executado a partir de um terminal" (RPi1B, Raspbian)
notme1560 12/04

Infelizmente, isso não ocorre nas versões recentes do su, que lê a senha do stdio .
moutonjr 7/10/19

-1

Codificar uma senha em um script expect é o mesmo que ter um sudo sem senha, na verdade pior, já que o sudo ao menos registra seus comandos.



-1

USAR:

echo password | sudo command

Exemplo:

echo password | sudo apt-get update; whoami

Espero que ajude..


-2

Você pode fornecer a senha como parâmetro para esperar o script.


-11
su -c "Command" < "Password"

Espero que seja útil.


1
Não é. "su: deve ser executado a partir de um terminal" é a resposta para isso.
Thelogix
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.