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

ex)

echo password | ssh id@server


这不起作用。

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

评论

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

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

unix.stackexchange.com/questions/38737/…|| unix.stackexchange.com/questions/38737/…|| stackoverflow.com/questions/233217/pass-password-to-su-sudo-ssh

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

这是一个纯粹的bash答案,---文件开始---#!/ bin / bash [[$ 1 =〜password:]] && cat || SSH_ASKPASS =“ $ 0” DISPLAY =没什么:0 exec setsid“ $ @” ---文件结尾---将其保存为pass,执行chmod + x pass,然后像这样使用它:$ echo mypass | ./pass ssh user @ host

#1 楼

不要使用密码。生成无密码的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

评论


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

– Eonil
2011年3月1日12:49

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

–user9517
2011年3月1日13:20

这是一个很好的答案,但不是对该问题的正确答案。

–约翰·亨特
13年7月4日在13:34

这些答案真的让我很烦。那不是问题。没有人问如何使用密钥对。

–马特·弗莱彻(Matt Fletcher)
16年6月16日在12:41

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

– srchulo
17年1月4日在20:42

#2 楼

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


评论


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

–约翰·亨特
13年7月4日在13:33

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

–user123444555621
13年8月2日在8:08

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

–user164495
14年4月11日在21:18

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

– NuclearPeon
15年5月14日在18:37

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

– CubicleSoft
16年7月16日在15:47

#3 楼

虽然您问题的正确答案是sshpass(有关详细信息,请参见其他答案),但是还有一种更安全的方法-SSH密钥。您距离解决方案仅三步之遥:
以下所有命令都在客户端运行,即您的机器
输入以下命令以开始生成rsa密钥对:
# ssh-keygen

当出现消息“输入要保存密钥的文件”时,只需按Enter即可将文件名保留为空白。
当终端要求您输入密码时,也将其保留为空白并按Enter 。
,然后使用一个简单的命令将密钥对复制到服务器上:
# ssh-copy-id userid@hostname

您现在无需密码即可登录:
# ssh userid@hostname


评论


使用默认值可以正常工作。尝试ssh-copy-id时,使用〜/ rsa4live.pub对我不起作用。

– Cees Timmerman
2015年6月4日上午10:08

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

– Venfah Nazir
16 Jun 17'在10:23



对我来说是ssh-copy-id -i〜/ .ssh / tatu-key-ecdsa user @ host

–加百利博览会
17年9月8日在21:47

这不是问题的答案。

–史蒂夫·贝内特(Steve Bennett)
17年11月27日在23:10

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

–lzap
17年11月30日在16:21

#4 楼

使用期望值:

#!/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


评论


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

– Eonil
2011年3月1日12:41

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

– Larrycai
2012年12月19日下午6:14

最好为ssh命令添加-oStrictHostKeyChecking = no -oUserKnownHostsFile = / dev / null以避免将计算机接收到known_hosts

– Larrycai
2012年12月19日下午6:15

B..b但是muh ssh键...

– Damien Bezborodow
17年6月1日在5:50

您可以在以下位置找到此脚本的更多详细示例:linuxaria.com/howto/…这里的示例也应适用于远程命令

– Radon8472
18年7月11日在13:39

#5 楼

我很惊讶没有人提到Ubuntu中的plink软件包中的putty-tools

评论


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

– Radon8472
18年7月11日在13:48



它在腻子工具包中

–管理员
18年9月14日在16:14

根据您的情况,这仍然是非常不安全的。命令行上的密码在进程列表中可见,并且可能由您的Shell记录。

–antiduh
19-10-30在21:29

确保它是不安全的,顺便说一句,没有什么可以阻止您从存储中读取KDE电子钱包(或GNOME密钥环)或其他密码管理器中的密码。

–管理员
5月8日15:57



#6 楼

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非常麻烦,可以说是编程语言更容易。在写入密码之前,可能会在您的pipe / fd上附加另一个过程。机会之窗很短,并且仅限于您的进程或root。

环境变量

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


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

命令行参数(最不安全)

 sshpass -p my_secret_password ssh user@host


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

边注

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


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


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

评论


如果您真的无法拒绝回答“不要这样做”,这就是您应该这样做的方式!回答实际问题,最后提出您不请自来的建议。干得好@nrolans。

– Timmmm
19/12/18在10:59

#7 楼

这可能对您没有任何用处,但是您可以使用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! $!";


评论


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

– EnabrenTane
2013年6月17日23:47

#8 楼

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

评论


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

– yunzen
15年4月14日在7:34

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

–卡巴斯德
16年5月17日在7:15

这不是答案。

–史蒂夫·贝内特(Steve Bennett)
17年11月27日在23:10

@SteveBennett与接受的答案相同,并且在其之前发布,尽管它的细节较少。

–迈克尔·汉普顿
18年8月4日在14:34

好吧,我想说被接受的答案是对未提出问题的一个体面的答案。没什么

–史蒂夫·贝内特(Steve Bennett)
18年8月6日在6:24

#9 楼

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

#10 楼

我更喜欢passh https://github.com/clarkwang/passh

sshpass被设计破坏了。

当我的known_hosts中尚未添加ssh服务器时,sshpass会不向我显示将服务器添加到我的已知主机的消息,passh没有此问题。

登录到远程服务器:

$ passh -p password ssh user@host