2008-10-24 45 views
117

我正在写一个C Shell程序,它将在做susudossh。他们都希望他们的密码在控制台输入(TTY)而不是标准输入或命令行。如何在不覆盖TTY的情况下将密码传递给su/sudo/ssh?

有没有人知道解决方案?设置无密码sudo不是一个选项。

可能是一个选项,但它不存在于我的精简系统中。

+0

SSH:http://serverfault.com/questions/241588/how-to-automate-ssh-login-with-password – 2015-11-30 21:23:46

回答

175

对于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,我做了很多尝试自动化/脚本的使用说明,但没有成功。似乎没有任何内置的方法可以在不提示的情况下将密码传递到命令中。正如其他人所提到的,“expect”实用程序似乎旨在解决这种困境,但最终设置正确的私钥授权是尝试自动执行此操作的正确方法。

+2

幸运的是,Ruby有一个内置SSH客户端,允许您指定密码。你可以试试 ruby​​ -e“require'net/ssh'; Net :: SSH.start('example.com','test_user',:password =>'secret')do | ssh | puts'登录成功'; while cmd = gets; puts ssh.exec!(cmd); end end“ – user1158559 2012-11-16 09:45:22

5

看看expect linux实用程序。

它允许你发送输出到stdio基于stdin简单模式匹配。

-1

在expect脚本中对密码进行硬编码与使用无密码sudo相同,实际上更糟,因为sudo至少记录了它的命令。

+16

没有人说任何关于任何地方的硬编码密码 – 2011-09-21 18:40:02

9

通常解决这个问题setuiding执行需要超级用户权限的任务助手应用程序:并不意味着 http://en.wikipedia.org/wiki/Setuid

须藤脱机使用。

后来编辑:SSH可以与私钥 - 公钥认证一起使用。如果私钥没有密码,可以在不提示输入密码的情况下使用ssh。

0

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

1

将SSH设置为公钥验证,密钥中没有任何密码。网上的指南负载。那么您将不需要密码即可登录。然后,您可以基于客户端主机名来限制密钥的连接。提供合理的安全性,非常适合自动登录。

30

我写了一些AppleScript的这提示用户通过一个对话框,输入密码,然后建立一个自定义的bash命令,就像这样:

echo <password> | sudo -S <command> 

我不知道如果这有助于。

如果sudo接受预先加密的密码,那么我可以在我的脚本中对其进行加密,而不用担心回显周围的明文密码。然而这对我和我的情况都有效。

-9
su -c "Command" < "Password" 

希望它有帮助。

+2

<取一个文件名 – chaz 2013-07-22 16:13:30

+1

它不是。 “su:必须从终端运行”是对此的答案。 – thelogix 2014-10-31 22:00:40

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

这是行得通的。

+10

在Ubuntu 14.04.1中不起作用LTS – 2014-08-15 23:39:15

+1

这是Fedora中唯一适用于我的作品。人们只是因为他们不适合他们的情况而低估了答案? – 2017-03-05 00:17:31

+1

“su:必须从终端运行”(RPi1B,Raspbian) – Punknoodles 2017-04-12 00:04:56

11

我有:

ssh [email protected] bash -c "echo mypass | sudo -S mycommand" 

为我工作。

4

当没有更好的选择(如由他人建议的),那么男人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的命令行上传递远程命令一样。

17

对于ssh,您可以使用sshpass -p "password" ssh [email protected] sshpass适合我。 您需要下载sshpass冷杉:)

3

也许你可以使用一个expect命令?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact 

该命令会自动给的密码。

8

这可以通过在要连接的目标主机上设置公钥/私钥来完成。 第一步是,通过执行来生成运行在本地主机上的脚本,用户的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> 
[email protected]_host's password: <Enter remote user's password here> 

注册ssh密钥后,您将能够从您的本地主机执行无声ssh [email protected]_host

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 [email protected]$IP mkdir -p /home/$US/TARGET-FOLDER 


    rm /tmp/ip 

    rm /tmp/user 

    rm /tmp/pass 

问候

泰特斯

8

sudo的,你也可以这样做:

sudo -S <<< "password" command 
1
ssh -t -t [email protected] << EOF 
echo SOMEPASSWORD | sudo -S do something 
sudo do something else 
exit 
EOF 
1

用途:

echo password | sudo command 

例子:

echo password | sudo apt-get update; whoami 

希望它有助于..

0

大厦@ Jahid的答案,这为我工作在MacOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers 
相关问题