如何在不覆盖TTY的情况下将密码传递给su / sudo / ssh?
题
我正在编写一个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 <password> | sudo -S <command>
我不确定这是否有帮助。
如果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"
适合我。
这可以通过在要连接的目标主机上设置公钥/私钥来完成。 第一步是通过执行:
为在本地主机上运行脚本的用户生成一个ssh密钥ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y
然后输入空白密码。之后,将ssh密钥复制到要连接的目标主机上。
ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>
注册ssh密钥后,您就可以从本地主机执行静默 ssh remote_user @ other_host
。
此问题的常用解决方案是设置执行需要超级用户访问权限的任务的帮助应用程序: http://en.wikipedia.org/wiki/Setuid
Sudo不打算脱机使用。
稍后编辑:SSH可以与私钥 - 公钥验证一起使用。如果私钥没有密码,则可以在不提示输入密码的情况下使用ssh。
对于sudo,你也可以这样做:
sudo -S <<< "password" command
如果没有更好的选择(正如其他人所建议的那样),那么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。
为公钥认证设置SSH,密钥上没有任何密码。网上有大量的指南。您不需要密码即可登录。然后,您可以根据客户端主机名限制密钥的连接。提供合理的安全性,非常适合自动登录。
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
我遇到了同样的问题。用于在远程PC上创建目录的对话框脚本。 用ssh对话很容易。我使用sshpass(以前安装过)。
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
来自德国的问候
泰特斯
使用:
echo password | sudo command
示例:
echo password | sudo apt-get update; whoami
希望它有助于......
基于@Jahid的回答,这对我在macOS 10.13上起作用了:
ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
您可以提供密码作为参数来预期脚本。
echo <password> | su -c <command> <user>
这很有效。
在expect脚本中硬编码密码与使用无密码sudo相同,实际上更糟糕,因为sudo至少记录了它的命令。
一种方法是使用read -s选项..这样,密码字符不会回显到屏幕上。我为一些用例编写了一个小脚本,你可以在我的博客中看到它: http://www.datauniv.com/博客/ 2013/02/21 / A-快一点,期待脚本/
su -c "Command" < "Password"
希望它有用。