我正在编写将要执行的C Shell程序,su
或者sudo
或orssh
。他们都希望在控制台输入(TTY)而不是stdin或命令行中输入密码。
有人知道解决方案吗?
设置无密码sudo
不是一种选择。
期望 可能是一个选择,但精简系统中没有该选项。
我正在编写将要执行的C Shell程序,su
或者sudo
或orssh
。他们都希望在控制台输入(TTY)而不是stdin或命令行中输入密码。
有人知道解决方案吗?
设置无密码sudo
不是一种选择。
期望 可能是一个选择,但精简系统中没有该选项。
Answers:
对于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,我已经做了很多尝试来自动化/脚本化它的用法,但是都没有成功。在没有提示的情况下,似乎没有任何内置方法可以将密码传递到命令中。正如其他人提到的那样,“ 期望 ”实用程序似乎旨在解决这一难题,但最终,设置正确的私钥授权是尝试使其自动化的正确方法。
nonroot:yourpassword@hostname.com
吗?当然,如果您使用密钥身份验证和密钥管理器,事情会容易得多。
'cat pw | sudo -S <command>
,后来rm pw
。
nc -l 12345 | sudo -S <command>
。在发送方;echo myPassord | nc <target> 12345
。这只是解决了密码处理问题,但大概是移至主控台,您可以在其中进行更多选择。
我有:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
为我工作。
解决此问题的常用方法是设置一个助手应用程序,该应用程序执行需要超级用户访问权限的任务:http : //en.wikipedia.org/wiki/Setuid
Sudo不能脱机使用。
稍后编辑:SSH可以与私钥-公钥身份验证一起使用。如果私钥没有密码短语,则可以使用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
然后输入一个空白密码。之后,将您的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
从本地主机执行静默操作。
也许您可以使用expect
命令?:
expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact
该命令会自动提供密码。
如果没有更好的选择(如其他人的建议),那么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的命令行上传递远程命令也是如此。
su
。su
没有-S(stdin)选项。
设置SSH以进行公共密钥身份验证,密钥上无密码。网络上的引导负荷。然后,您不需要密码即可登录。然后,您可以基于客户端主机名限制密钥的连接。提供合理的安全性,非常适合自动登录。
我有同样的问题。对话框脚本以在远程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
来自德国的问候
山雀
更好的sshpass
选择是:passh
https //github.com/clarkwang/passh
登录到远程服务器
$ passh -p password ssh user@host
在远程服务器上运行命令
$ passh -p password ssh user@host date
其他通过密码的方法
-p密码(默认值:“密码”)
-p env:从env var读取密码
-p文件:从文件读取密码
在这里,我解释了为什么它比sshpass和其他解决方案更好。
echo <password> | su -c <command> <user>
可以了
su
从stdio读取密码。
在Expect脚本中对密码进行硬编码与使用无密码sudo相同,实际上更糟,因为sudo至少会记录其命令。
一种方法是使用read -s选项..这样,密码字符不会回显到屏幕上。我为一些用例编写了一个小脚本,您可以在我的博客中看到它:http : //www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/