如何使用密码自动进行SSH登录?我正在配置我的测试VM,因此不考虑高安全性。选择SSH可以通过最少的配置获得可接受的安全性。
例如)
echo password | ssh id@server
这行不通。
我记得我是用有人指导我的一些技巧来做到这一点的,但现在我不记得我曾经使用过的技巧了。
如何使用密码自动进行SSH登录?我正在配置我的测试VM,因此不考虑高安全性。选择SSH可以通过最少的配置获得可接受的安全性。
例如)
echo password | ssh id@server
这行不通。
我记得我是用有人指导我的一些技巧来做到这一点的,但现在我不记得我曾经使用过的技巧了。
Answers:
不要使用密码。生成无密码的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
如果您想尝试使用密码来保护密钥,则可能还需要研究使用。
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
ssh
在使用之前先运行一次sshpass
,以确认RSA指纹
history -r
在命令后运行以清除您的历史记录。好点。
虽然您问题的正确答案是sshkey,但是还有一种更安全的方法-SSH密钥。您距离解决方案仅三步之遥:
生成一个rsa密钥对:
# ssh-keygen
然后使用一个简单的命令将其复制到服务器上:
# ssh-copy-id userid@hostname
您现在可以不用密码登录:
# ssh userid@hostname
ssh-copy-id
。
ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
使用预期:
#!/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
-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null
ssh命令,以免将机器
这可能对您没有用,但是您可以使用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! $!";
我提到惊讶没有人plink
从putty-tools
包在Ubuntu:
plink user@domain -pw mypass [cmd]
它也可以在Windows上使用,并且语法主要与openssh客户端兼容。
putty-tools
包装中
SSH单点登录通常通过公钥身份验证和身份验证代理来实现。您可以轻松地将测试VM密钥添加到现有的身份验证代理(请参见下面的示例)。存在其他方法,例如gssapi / kerberos,但更为复杂。
在password
唯一可用的身份验证方法的情况下,可以使用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
并在敏感命令前添加一个空格。它们不会保存在历史记录中。
# 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
密码短语非常重要。如果没有密码短语,以某种方式获得私钥文件的任何人将无法使用它。
# 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
优点是您的私钥已加密,您只需输入一次密码(也可以通过更安全的输入方法)。
确定不想使用SSH密钥而不是密码吗?这样既安全又自动。
根据您的自动化需求,Ansible可能会很适合您。它可以很好地管理诸如提示输入密码,提示输入sudo密码,各种更改使用方式,安全地使用加密机密(库)之类的事情。
如果那不合适,我会建议“期望”,如另一个答案中所建议的那样。