如何在不重写TTY的情况下将密码传递给su / sudo / ssh?
我正在编写一个C shell程序,它将执行su
或sudo
或ssh
。 他们都希望他们的密码在控制台input(TTY),而不是标准input或命令行。
有人知道解决scheme吗?
设置无密码sudo
不是一个选项。
期望可能是一个select,但它不存在于我的精简系统。
对于sudo,有一个-S选项可以接受来自标准input的密码。 这是男人的条目:
-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,我已经做了很多尝试,自动化/脚本的使用没有成功。 似乎没有任何build立的方式来传递密码到命令没有提示。 正如其他人所提到的那样,“ expect ”实用程序似乎是为了解决这个困境,但最终build立正确的私钥授权是尝试自动化的正确方法。
我写了一些Applescript,通过对话框提示input密码,然后生成一个自定义的bash命令,如下所示:
echo <password> | sudo -S <command>
我不确定这是否有帮助。
如果sudo接受预先encryption的密码,那么会很好,所以我可以在脚本中对它进行encryption,而不用担心回显周围的明文密码。 但是,这对我和我的情况。
对于SSH你可以使用sshpass -p "password" ssh user@host
sshpass适合我。 你需要下载sshpass firs 🙂
我有:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
为我工作。
解决这个问题的通常办法是设置一个帮助程序,执行需要超级用户访问的任务: http : //en.wikipedia.org/wiki/Setuid
Sudo不打算离线使用。
稍后编辑:SSH可以与私钥 – 公钥authentication一起使用。 如果私钥没有密码,可以在不提示input密码的情况下使用ssh。
这可以通过在要连接的目标主机上设置公钥/私钥来完成。 第一步是通过执行以下命令为在本地主机上运行脚本的用户生成一个ssh密钥:
ssh-keygen Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default> Overwrite (y/n)? y
然后input一个空白的密码。 之后,将您的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
。
对于sudo,你也可以这样做:
sudo -S <<< "password" command
如果没有更好的select(正如其他人所build议的那样),那么人类社会可以帮助:
(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
Linux实用程序。
它允许你发送输出到stdio基于stdin简单的模式匹配。
也许你可以使用expect
命令?
expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact
该命令自动给出密码。
将SSH设置为公钥authentication,密钥中不含任何口令。 网上的指南负载。 那么您将不需要密码即可login。 然后,您可以基于客户端主机名来限制密钥的连接。 提供合理的安全性,非常适合自动login。
echo <password> | su -c <command> <user>
这是工作。
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
使用:
echo password | sudo command
例:
echo password | sudo apt-get update; whoami
希望它帮助..
您可以提供密码作为参数以期望脚本。
在期望脚本中对密码进行硬编码与使用无密码sudo相同,实际上更糟,因为sudo至lesslogging了它的命令。
我有同样的问题。 对话框脚本在远程PC上创build目录。 用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
来自德国的问候
泰特斯
build立在@ Jahid的答案,这对我在macOS 10.13工作:
ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
一种方法是使用read -s选项。这样密码字符不会回显到屏幕上。 我为一些用例写了一个小脚本,你可以在我的博客中看到它: http : //www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/
su -c "Command" < "Password"
希望这是有帮助的。