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


148

我正在编写将要执行的C Shell程序,su或者sudo或orssh。他们都希望在控制台输入(TTY)而不是stdin或命令行中输入密码。

有人知道解决方案吗?

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

可能是一个选择,但精简系统中没有该选项。



Answers:


215

对于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,我已经做了很多尝试来自动化/脚本化它的用法,但是都没有成功。在没有提示的情况下,似乎没有任何内置方法可以将密码传递到命令中。正如其他人提到的那样,“ 期望 ”实用程序似乎旨在解决这一难题,但最终,设置正确的私钥授权是尝试使其自动化的正确方法。


2
幸运的是,Ruby具有内置的SSH客户端,可让您指定密码。您可以尝试ruby -e“ require'net / ssh'; Net :: SSH.start('example.com','test_user',:password =>'secret')do | ssh |将'Logged in成功';而cmd = gets;放入ssh.exec!(cmd);结束“
user1158559

13
我不想在这里成为派对狂欢者,但是这样做会使您的密码显示在进程列表中。我试图确定一种更好的方法,并且偶然发现了本文,但没有人指出这一点,我感到很惊讶。好的解决方案,但要提防风险。
马特

关于ssh,您是否尝试过在连接字符串中传递密码?喜欢nonroot:yourpassword@hostname.com吗?当然,如果您使用密钥身份验证和密钥管理器,事情会容易得多。
Killah 2015年

12
避免将密码放入文件中并使用cat来将密码显示在进程列表或日志文件中; 'cat pw | sudo -S <command>,后来rm pw
CAB

另一种方法是使用netcat并通过套接字-传递密码nc -l 12345 | sudo -S <command>。在发送方;echo myPassord | nc <target> 12345。这只是解决了密码处理问题,但大概是移至主控台,您可以在其中进行更多选择。
CAB

36

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

echo <password> | sudo -S <command>

我不确定这是否有帮助。

如果sudo接受了预先加密的密码,那就太好了,因此我可以在脚本中对其进行加密,而不必担心在周围回显明文密码。但是,这对我和我的情况都有效。


27

对于ssh您可以使用sshpasssshpass -p yourpassphrase ssh user@host

您只需要先下载sshpass :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

我有:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

为我工作。


没为我工作。仍然ssh提示输入密码。
2014年

很好,最后我可以使用!谢谢。我在bash脚本中使用此脚本,该脚本启动ssh会话并将sudo命令传递给客户端。我的脚本将以下内容解析为:ssh -t username @ hostname bash -c“ sudo echo fartjuice”
James T Snell

12

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

sudo -S <<< "password" command

10

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

Sudo不能脱机使用。

稍后编辑:SSH可以与私钥-公钥身份验证一起使用。如果私钥没有密码短语,则可以使用ssh而不提示输入密码。


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

然后输入一个空白密码。之后,将您的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从本地主机执行静默操作。


7

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

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

该命令会自动提供密码。


看起来不错,但是如何在没有root权限的机器上启用Expect命令?
Radon8472 '18年

1
@ Radon8472如果您没有安装可执行文件的权限,则可以将其添加到〜/ bin中。如果您的系统没有自动将〜/ bin添加到PATH,则可以使用export PATH =“ $ PATH:〜/ bin”手动添加,或将该命令添加到您的配置文件中以自动执行。如果您不想更改PATH,则可以使用其绝对路径执行命令:〜/ bin / expect [arguments]请务必记住设置其可执行位:chmod +
x〜

6

如果没有更好的选择(如其他人的建议),那么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的命令行上传递远程命令也是如此。


1
这实际上也将起作用susu没有-S(stdin)选项。
2012年

是否有可能避免入睡而改用更可靠的东西?
Michael Pankov

6

看一眼 expect linux实用程序。

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


1

设置SSH以进行公共密钥身份验证,密钥上无密码。网络上的引导负荷。然后,您不需要密码即可登录。然后,您可以基于客户端主机名限制密钥的连接。提供合理的安全性,非常适合自动登录。


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

如果您可以使用ssh密钥作为用户登录,则可以进行sudo访问:ssh -t user @ host“ echo mypassword | sudo -S sudocommand”
Jack

0

我有同样的问题。对话框脚本以在远程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

来自德国的问候

山雀


0

基于@Jahid的答案,这在macOS 10.13上对我有效:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

更好的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和其他解决方案更好。


-1
echo <password> | su -c <command> <user> 

可以了


1
这是Fedora中唯一适合我的作品。人们对答案的投票仅仅是因为他们在自己的情况下不工作吗?
Hangchen Yu

2
“ su:必须从终端运行”(RPi1B,Raspbian)
notme1560

不幸的是,这在最新版本的中没有,而是sustdio读取密码。
moutonjr



-1

用:

echo password | sudo command

例:

echo password | sudo apt-get update; whoami

希望能帮助到你..


-2

您可以提供密码作为期望脚本的参数。


-11
su -c "Command" < "Password"

希望对您有所帮助。


1
不是。答案是“ su:必须从终端运行”。
thelogix 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.