如何在不覆盖TTY的情况下将密码传递给su/sudo/ssh?

n-a*_*der 141 linux passwords ssh sudo su

我正在写一个C Shell程序,它正在做su或者sudo或者ssh.他们都希望他们的密码在控制台输入(TTY)而不是stdin或命令行.

有人知道解决方案吗?

设置无密码sudo不是一种选择.

可能是一个选择,但它在我的精简系统中不存在.

Jes*_*ebb 206

对于sudo,有一个-S选项用于接受标准输入的密码.这是男人的入口:

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

这将允许您运行如下命令:

echo myPassword | sudo -S ls /tmp
Run Code Online (Sandbox Code Playgroud)

至于ssh,我已经做了很多尝试来自动化/编写它的用法并没有成功.似乎没有任何内置方法可以在没有提示的情况下将密码传递给命令.正如其他人所提到的," 期望 "实用程序似乎旨在解决这一难题,但最终,设置正确的私钥授权是尝试自动化时的正确方法.

  • 我不想在这里成为派对的人,但这样做可以使你的密码显示在进程列表中.我试图确定一种更好的方法并且遇到了这篇文章,并且没有人指出它,我感到很惊讶.很好的解决方案,但要注意风险. (13认同)
  • 通过将密码放入文件并使用cat,避免密码显示在进程列表或日志文件中; ''猫pw | sudo -S <command>`,以及后来的`rm pw`. (9认同)
  • 对于ssh自动化,今天有[sshpass](http://linux.die.net/man/1/sshpass). (3认同)
  • 幸运的是,Ruby有一个内置的SSH客户端,允许您指定密码.你可以尝试ruby -e"require'net/ssh'; Net :: SSH.start('example.com','test_user',:password =>'secret')do | ssh | puts'登录成功';而cmd = gets; put ssh.exec!(cmd); end end" (2认同)

mla*_*bie 36

我写了一些Applescript,它通过对话框提示输入密码,然后构建一个自定义bash命令,如下所示:

echo <password> | sudo -S <command>
Run Code Online (Sandbox Code Playgroud)

我不确定这是否有帮助.

如果sudo接受了预先加密的密码,那就太好了,所以我可以在我的脚本中加密它,而不用担心回复明文密码.然而,这适用于我和我的情况.


小智 26

对于ssh您可以使用sshpass:sshpass -p yourpassphrase ssh user@host.

你只需要先下载sshpass :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
Run Code Online (Sandbox Code Playgroud)


小智 12

我有:

ssh user@host bash -c "echo mypass | sudo -S mycommand"
Run Code Online (Sandbox Code Playgroud)

适合我.

  • 不适合我。ssh 仍然提示输入密码。 (2认同)

Jah*_*hid 11

对于sudo,你也可以这样做:

sudo -S <<< "password" command
Run Code Online (Sandbox Code Playgroud)


Byo*_*ob 10

这可以通过在要连接的目标主机上设置公钥/私钥来完成.第一步是通过执行以下命令为在本地主机上运行脚本的用户生成一个ssh密钥:

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

然后输入空白密码.之后,将ssh密钥复制到要连接的目标主机上.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>
Run Code Online (Sandbox Code Playgroud)

注册ssh密钥后,您就可以ssh remote_user@other_host从本地主机执行静默.


dic*_*ciu 9

解决此问题的常用方法是设置一个帮助应用程序来执行需要超级用户访问的任务:http: //en.wikipedia.org/wiki/Setuid

Sudo不打算脱机使用.

稍后编辑:SSH可以与私钥 - 公钥验证一起使用.如果私钥没有密码短语,则可以在不提示输入密码的情况下使用ssh.


Mar*_*rey 6

如果没有更好的选择(正如其他人所建议的那样),那么man socat可以提供帮助:

   (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.
Run Code Online (Sandbox Code Playgroud)

所有的pty,setsid,ctty复杂性都是必要的,虽然你可能不需要长时间睡眠,但你需要睡觉.echo = 0选项也值得一看,就像在ssh的命令行上传递远程命令一样.

  • 这实际上也适用于“su”。`su` 没有 -S (stdin) 选项。 (2认同)

adh*_*own 6

也许您可以使用expect命令?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact
Run Code Online (Sandbox Code Playgroud)

该命令会自动提供密码。


Mar*_*rko 5

看看expectlinux实用程序.

它允许您基于stdin上的简单模式匹配将输出发送到stdio.