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.

n-alexander
fonte

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.

Jesse Webb
fonte
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:[email protected]? 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.

mlambie
fonte
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
Edward
fonte
12

Eu tenho:

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

Funciona para mim.

David Dawson
fonte
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
Jahid
fonte
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.

diciu
fonte
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.

Byob
fonte
7

Talvez você possa usar um expectcomando ?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

Esse comando fornece a senha automaticamente.

adhown
fonte
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.

Martin Dorey
fonte
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.

Marko
fonte
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.


fonte
1
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
Ed Bishop
fonte
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

titus
fonte
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
JS.
fonte
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.

Badr Elmers
fonte
-1
echo <password> | su -c <command> <user> 

Isso está funcionando.

DevOz
fonte
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.

Aleksandar Ivanisevic
fonte
-1

USAR:

echo password | sudo command

Exemplo:

echo password | sudo apt-get update; whoami

Espero que ajude..

Sarat Chandra
fonte
-2

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

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

Espero que seja útil.

Shankar
fonte
1
Não é. "su: deve ser executado a partir de um terminal" é a resposta para isso.
Thelogix