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

Estou escrevendo um programa C Shell que fará su ou sudo ou ssh . Todos querem suas senhas na input do console (o TTY) em vez de stdin ou na linha de comando.

Alguém conhece uma solução?

Configurar o sudo sem senha não é uma opção.

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

Para o sudo existe uma opção -S para aceitar a senha da input padrão. Aqui está a input 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, eu fiz muitas tentativas para automatizar / script seu uso sem sucesso. Não parece haver nenhuma maneira de passar a senha para o comando sem avisar. Como outros já mencionaram, o utilitário ” espera ” parece ter como objective resolver esse dilema, mas, em última análise, configurar a autorização de chave privada correta é o caminho correto a ser seguido ao tentar automatizar isso.

Eu escrevi alguns Applescript que solicita uma senha através de uma checkbox de diálogo e, em seguida, cria um comando bash personalizado, como este:

 echo  | sudo -S  

Não tenho certeza se isso ajuda.

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

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

Você só precisa baixar sshpass primeiro 🙂

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

Eu tenho:

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

Funciona para mim.

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

O Sudo não deve 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 frase secreta, o ssh pode ser usado sem solicitar uma senha.

Isso pode ser feito configurando chaves públicas / privadas nos hosts de destino aos quais você se conectará. O primeiro passo 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):  Overwrite (y/n)? y 

Em seguida, insira 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's password:  

Depois de registrar as chaves ssh, você poderá executar um ssh remote_user@other_host partir do host local.

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

 sudo -S < << "password" command 

Quando não há melhor escolha (como sugerido por outros), então man 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 é necessária e, embora você não precise dormir tanto tempo, precisará dormir. A opção echo = 0 também merece uma olhada, já que está passando o comando remoto na linha de comando do ssh.

Dê uma olhada no utilitário de expect Linux.

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

Talvez você possa usar um comando expect ?:

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

Esse comando fornece a senha automaticamente.

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

USAR:

 echo password | sudo command 

Exemplo:

 echo password | sudo apt-get update; whoami 

Espero que ajude..

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

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

Eu tive o mesmo problema. script de diálogo para criar diretório no pc remoto. diálogo com o 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

tito

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

 ssh @ sudo -S < <<  cat /etc/sudoers 
 echo  | su -c   

Isso está funcionando.

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

Uma maneira seria usar a opção read-s … desta forma, os caracteres de senha não são ecoados de volta para a canvas. Eu escrevi um pequeno script para alguns casos de uso e você pode vê-lo no meu blog: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/

 su -c "Command" < "Password" 

Espero que seja útil.