如何使用密码自动进行SSH登录?


419

如何使用密码自动进行SSH登录?我正在配置我的测试VM,因此不考虑高安全性。选择SSH可以通过最少的配置获得可接受的安全性。

例如)

echo password | ssh id@server

这行不通。

我记得我是用有人指导我的一些技巧来做到这一点的,但现在我不记得我曾经使用过的技巧了。


2
FreeBSD不接受无密码密钥。别动心。但是,某些Linux服务器接受了它。我相信Linux服务器配置错误。
Eonil'3

16
这是一个有效的问题。例如,我要允许用户输入密码,然后使用该密码登录另一台计算机。我不能假设在我们所有的机器上都会分布ssh密钥。到目前为止,下面的答案对这种情况没有帮助。
dfrankow 2012年


非常重要的问题。我也需要一个答案,我的Webspace提供程序会阻止将密钥文件放置在服务器上,因此我必须传递不包含密钥文件的密码。
Radon8472 '18年

Answers:


382

不要使用密码。生成无密码的SSH密钥并将其推送到您的VM。

如果您已经有了SSH密钥,则可以跳过此步骤……只需按一下Enter该密钥,然后输入两个密码:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

将密钥复制到目标服务器:

$ ssh-copy-id id@server
id@server's password: 

现在,尝试使用登录到计算机ssh 'id@server',然后签入:

.ssh/authorized_keys

以确保我们没有添加您没有期望的额外键。

最后检查登录...

$ ssh id@server

id@server:~$ 

ssh-agent如果您想尝试使用密码来保护密钥,则可能还需要研究使用。


14
我最终决定使用密钥对。因为我意识到这是最简单的方法。
Eonil'3

9
@Eonil:不要试图使用没有密码短语的键。了解如何使用ssh-agent或选美。
user619714 2011年

119
这是一个很好的答案,但不是对该问题的正确答案。
约翰·亨特2013年

74
这些答案真的让我很烦。那不是问题。没有人问如何使用密钥对。
马特·弗莱彻

16
这不能回答问题。对于一个完全不同的问题,这是一个很好的答案,但是对于一个被问到的问题却是可怕的。
srchulo

594
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
是的,有时由于各种原因您不能使用基于密钥的身份验证。例如,现在我不能在plesk服务器上使用keyauth,因为开箱即用它没有启用,而且我没有root用户。
约翰·亨特2013年

17
+1!附带说明一下,您需要ssh在使用之前先运行一次sshpass,以确认RSA指纹
2013年

21
-1,表示必须在命令中使用密码。这会将密码以.bash_history纯文本格式记录在您的计算机上。

15
@MisterDood您可以history -r在命令后运行以清除您的历史记录。好点。
NuclearPeon

20
专家提示:如果您不想在.bash_history中显示特定命令,请在命令前加上空格。它只是工作。但是,此命令的用户应该更加担心,系统上的非特权用户可以看到带有ps的完整命令行,其中当然包括密码。由于ssh会话通常是长期存在的,因此这是一个安全问题。
CubicleSoft

71

虽然您问题的正确答案是sshkey,但是还有一种更安全的方法-SSH密钥。您距离解决方案仅三步之遥:

生成一个rsa密钥对

# ssh-keygen

然后使用一个简单的命令将其复制到服务器上:

# ssh-copy-id userid@hostname

您现在可以不用密码登录

# ssh userid@hostname

1
使用默认值可以正常工作。尝试使用〜/ rsa4live.pub不适用于我ssh-copy-id
Cees Timmerman 2015年

1
如果您希望此步骤适用于其他用户,请执行以下操作:1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
对我来说是ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
加百利博览会

21
这不是问题的答案。
史蒂夫·贝内特

2
和?答案在上面,sshpass ...
lzap

40

使用预期:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

例:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

2
它可以工作,但是无法打印远程计算机的标准输出。
Eonil'3

它适用于某些机器,因为每次更改IP地址都无法预先输入密钥。
larrycai 2012年

4
最好添加-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullssh命令,以免将机器
接受到

乙。B,但慕SSH密钥...
达明ÓCeallaigh

您可以在以下地址找到此脚本的更多详细示例: linuxaria.com/howto/… 此示例也应与远程命令一起使用
Radon8472 '18

16

这可能对您没有用,但是您可以使用Perl来做到这一点:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";

2
同样,您可以使用此Ruby github.com/net-ssh/net-ssh
EnabrenTane 2013年

15

我提到惊讶没有人plinkputty-tools包在Ubuntu:

plink user@domain -pw mypass  [cmd]

它也可以在Windows上使用,并且语法主要与openssh客户端兼容。


对于Windows,您的答案是好的,不幸的是linux / unix用户通常没有plink
Radon8472 '18

2
它在putty-tools包装中
eadmaster

10

SSH单点登录通常通过公钥身份验证和身份验证代理来实现。您可以轻松地将测试VM密钥添加到现有的身份验证代理(请参见下面的示例)。存在其他方法,例如gssapi / kerberos,但更为复杂。

sshpass

password唯一可用的身份验证方法的情况下,可以使用sshpass自动输入密码。请特别注意手册页的“ 安全注意事项”部分。在所有这三个选项中,在某些时候密码都是可见的或以纯文本形式存储的

匿名管道(由sshpass推荐)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

bash非常麻烦,可以说是使用编程语言更容易。写入密码之前,可能需要在管道/ fd上附加另一个过程。机会之窗很短,并且仅限于您的流程或根本。

环境变量

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

在sshpass运行(cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=)时,您和root用户可以读取进程的环境变量(即密码)。机会的窗口更长,但仍然仅限于您自己的进程或root,而不是其他用户。

命令行参数(最不安全)

 sshpass -p my_secret_password ssh user@host

如手册页中所述,这很方便,但是不太安全。命令行参数对所有用户可见(例如ps -ef | grep sshpass)。sshpass尝试隐藏参数,但是仍然存在一个窗口,在此窗口中,所有用户都可以看到由参数传递的密码。

边注

将bash的HISTCONTROL变量设置为ignorespace或,ignoreboth并在敏感命令前添加一个空格。它们不会保存在历史记录中。


SSH公钥认证

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

密码短语非常重要。如果没有密码短语,以某种方式获得私钥文件的任何人将无法使用它。

设置SSH身份验证代理

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

照常连接

ssh user@host

优点是您的私钥已加密,您只需输入一次密码(也可以通过更安全的输入方法)。


8

确定不想使用SSH密钥而不是密码吗?这样既安全又自动。


3
使用不带密码的SSH密钥仅比在文件中使用密码稍微安全。
yunzen 2015年

10
@yunzen不正确。密钥身份验证即使您不知道主机密钥,也可以保护您免受mitm攻击。攻击者可以模拟服务器,但从不连接到真实服务器。使用密码身份验证,您连接到的任何服务器(合法与否)都将看到密码。由于这些原因,没有密码的ssh密钥比仅将密码存储在文件中要安全得多。
卡巴斯德

14
这不是答案。
史蒂夫·贝内特

@SteveBennett与接受的答案相同,并且在它之前发布,尽管它的细节较少。
迈克尔·汉普顿

3
好吧,我想说被接受的答案是对未提出问题的一个体面的答案。没什么
史蒂夫·贝内特

4

根据您的自动化需求,Ansible可能会很适合您。它可以很好地管理诸如提示输入密码,提示输入sudo密码,各种更改使用方式,安全地使用加密机密(库)之类的事情。

如果那不合适,我会建议“期望”,如另一个答案中所建议的那样。

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.