Pergunta

Eu estou escrevendo um programa C Shell que vai fazer su ou sudo ou ssh. Todos eles querem que suas senhas na entrada do console (o TTY), em vez de stdin ou a linha de comando.

Alguém sabe uma solução?

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

poderia ser uma opção, mas é não está presente no meu despojado sistema.

Foi útil?

Solução

Para sudo há uma opção -S para aceitar a senha da entrada padrão. Aqui é a entrada de homem:

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

Isto irá permitir que você execute um comando como:

echo myPassword | sudo -S ls /tmp

Como para ssh, eu fiz muitas tentativas para automatizar / script-lo do uso sem sucesso. Não parece haver qualquer build-in maneira de passar a senha para o comando sem avisar. Como já foi mencionado, o " esperar " utilidade parece que ele está destinado a abordar este dilema, mas em última análise, , estabelecendo a autorização de chave privada correta é a maneira correta para ir ao tentar automatizar isso.

Outras dicas

Eu escrevi alguns Applescript que solicitará uma senha através de uma caixa de diálogo e, em seguida, constrói um comando bash personalizado, como este:

echo <password> | sudo -S <command>

Eu não tenho certeza se isso ajuda.

Seria bom se sudo aceitou uma senha pré-criptografado, para que eu pudesse cifrar-lo dentro do meu script e não se preocupar com ecoando senhas em texto puro ao redor. No entanto, este 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.

Isto pode ser feito através da criação de chaves públicas / privadas sobre os hosts de destino que você vai estar ligados. O primeiro passo seria a de gerar uma chave ssh para o usuário executar 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 a sua chave ssh para o host de destino que 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ê seria capaz de executar uma ssh remote_user@other_host silenciosa de você host local.

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

Sudo não pretende estar offline usado.

Editar Mais tarde: SSH pode ser usado com autenticação de chave público-privada. Se a chave privada não tem uma senha, ssh pode ser usado sem solicitar uma senha.

Para sudo você pode fazer isso também:

sudo -S <<< "password" command

Quando não há melhor escolha (como sugerido por outros), então 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.

Todo o pty, setsid, complexidade CTTY é necessária e, enquanto você pode não precisar dormir tanto tempo, você vai precisar para dormir. A opção de eco = 0 vale uma olhada também, como é passar o comando remoto na linha de comando do ssh.

Talvez você pode usar um comando expect:?

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

Esse comando dá a senha automaticamente.

Dê uma olhada utilidade expect linux.

Ele permite que você enviar a saída para stdio com base em simples correspondência de padrões em stdin.

Set SSH para autenticação de chave pública, sem pasphrase no Key. Cargas de guias na net. Você não vai precisar de uma senha para o login depois. Você pode, então, limitar as ligações para uma chave com base no nome do host cliente. Fornece segurança razoável e é ótimo para logins automatizados.

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

Eu tive o mesmo problema. roteiro de diálogo para criar a pasta no PC remoto. diálogo com ssh é fácil. Eu uso 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

Greetings from Germany

Tito

Uso:

echo password | sudo command

Exemplo:

echo password | sudo apt-get update; whoami

Espero que ajude ..

Com base na resposta da @ Jahid, isso funcionou para mim no MacOS 10.13:

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

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

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

Isso está funcionando.

hardcoding uma senha em uma espera de script é o mesmo que ter um sudo sem senha, realmente pior, uma vez sudo pelo menos registra seus comandos.

Uma forma seria a de usar, leia a opção -s .. Desta forma, os caracteres da senha não são ecoou de volta para a tela. 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-esperar-script /

su -c "Command" < "Password"

Hope isso é útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top