使用ssh时如何自动输入密码?

inn*_*inn 2 ssh perl automation

如何在Perl中自动输入密码?

码:

my $makecmd .=  system "ssh remotehost;";
system( "$makecmd" );
Run Code Online (Sandbox Code Playgroud)

输出:

Enter passphrase for key '~/.ssh/id_rsa':
Run Code Online (Sandbox Code Playgroud)

Thi*_*Not 7

您可以使用SSH代理将密码存储在内存中.虽然这种方法比使用未加密的密钥比较烦琐,这是稍微更安全.在O'Reilly的书籍"安全外壳:权威指南 "第11.1节" 无人值守的SSH:批处理"或"cron作业",对这两种方法进行了很好的比较.

使用未加密的密钥

使用未加密(无密码)密钥的一大优点是易于配置.要生成具有空密码短语的密钥或在现有密钥上将密码短语设置为空,请运行

ssh-keygen -f ~/.ssh/id_rsa -p
Run Code Online (Sandbox Code Playgroud)

就是这样,不再需要配置.这样做的一大缺点是您的私钥现在以纯文本格式存在于您的文件系统中.

使用代理

SSH代理的配置过程涉及更多,取决于您使用的代理.O'Reilly一书的第6.3章,SSH代理和IBM developerWorks文章SSH安全性和配置入门描述了如何配置ssh-agentOpenSSH附带的默认代理.SSH Keys上的archlinux wiki页面还描述了GNOME Keyring和pam_ssh等其他代理.

让我们来看看设置过程ssh-agent.运行命令时

ssh-agent
Run Code Online (Sandbox Code Playgroud)

它不仅启动代理,而且还吐出shell命令来设置一些环境变量.在Bourne样式的shell中,输出如下所示:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-barrett/ssh-3654-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3655; export SSH_AGENT_PID;
echo Agent pid 3655;
Run Code Online (Sandbox Code Playgroud)

这些环境变量告诉shell如何访问代理.使用代理的任何脚本都需要设置这些环境变量.您可以将shell命令保存到文件中,以便以后在首次调用代理时使用:

$ ssh-agent | head -2 > ~/agent-info
Run Code Online (Sandbox Code Playgroud)

接下来,您需要将您的私钥添加到代理:

$ source ~/agent-info
$ ssh-add ~/.ssh/id_rsa
Need passphrase for ~/.ssh/id_rsa
Enter passphrase: **************
Run Code Online (Sandbox Code Playgroud)

最后,您需要确保在调用Perl脚本时设置适当的环境变量.一种方法是编写一个包装脚本:

#!/bin/sh
source ~/agent-info
/path/to/perl/script "$@"
Run Code Online (Sandbox Code Playgroud)

只要代理程序正在运行,您的脚本就可以使用私钥而无需输入密码.请注意,如果只有一个uid将使用代理,那么在该uid下启动代理将是最简单的:

$ su <script_user> ssh-agent ...
Run Code Online (Sandbox Code Playgroud)

使用代理的一个缺点是您必须手动重新启动代理并在服务器重新引导时重新输入密码.这是您为使用加密密钥获得的(可以说是边际的)额外安全性所支付的价格.