我正在写一个C Shell程序,它正在做su
或者sudo
或者ssh
.他们都希望他们的密码在控制台输入(TTY)而不是stdin或命令行.
有人知道解决方案吗?
设置无密码sudo
不是一种选择.
期望可能是一个选择,但它在我的精简系统中不存在.
对于sudo,有一个-S选项用于接受标准输入的密码.这是男人的入口:
-S The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
这将允许您运行如下命令:
echo myPassword | sudo -S ls /tmp
至于ssh,我已经做了很多尝试来自动化/编写它的用法并没有成功.似乎没有任何内置方法可以在没有提示的情况下将密码传递给命令.正如其他人所提到的," 期望 "实用程序似乎旨在解决这一难题,但最终,设置正确的私钥授权是尝试自动化时的正确方法.
我写了一些Applescript,它通过对话框提示输入密码,然后构建一个自定义bash命令,如下所示:
echo| sudo -S
我不确定这是否有帮助.
如果sudo接受了预先加密的密码,那就太好了,所以我可以在我的脚本中加密它,而不用担心回复明文密码.然而,这适用于我和我的情况.
对于ssh
您可以使用sshpass
:sshpass -p yourpassphrase ssh user@host
.
你只需要先下载sshpass :)
$ apt-get install sshpass $ sshpass -p 'password' ssh username@server
我有:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
适合我.
对于sudo,你也可以这样做:
sudo -S <<< "password" command
这可以通过在要连接的目标主机上设置公钥/私钥来完成.第一步是通过执行以下命令为在本地主机上运行脚本的用户生成一个ssh密钥:
ssh-keygen Enter file in which to save the key (/home/myuser/.ssh/id_rsa):Overwrite (y/n)? y
然后输入空白密码.之后,将ssh密钥复制到要连接的目标主机上.
ssh-copy-id@ remote_user@other_host's password:
注册ssh密钥后,您就可以ssh remote_user@other_host
从本地主机执行静默.
解决此问题的常用方法是设置一个帮助应用程序来执行需要超级用户访问的任务:http: //en.wikipedia.org/wiki/Setuid
Sudo不打算脱机使用.
稍后编辑:SSH可以与私钥 - 公钥验证一起使用.如果私钥没有密码短语,则可以在不提示输入密码的情况下使用ssh.
如果没有更好的选择(正如其他人所建议的那样),那么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.
所有的pty,setsid,ctty复杂性都是必要的,虽然你可能不需要长时间睡眠,但你需要睡觉.echo = 0选项也值得一看,就像在ssh的命令行上传递远程命令一样.
也许您可以使用expect
命令?:
expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact
该命令会自动提供密码。
看看expect
linux实用程序.
它允许您基于stdin上的简单模式匹配将输出发送到stdio.