【发布时间】:2017-04-21 23:29:48
【问题描述】:
我有一个执行此操作的 Perl 脚本:它在我的系统上生成一个 ssh 身份验证密钥,然后将此密钥复制到远程 Linux 系统以进行无密码 ssh 连接。代码如下:
# Generate an rsa key and store it in the given file
system("ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa 1>/dev/null");
# Copy the generated key to a remote system whose username
# is stored in variable $uname and IP address is stored in variable $ip
system("ssh-copy-id -i /root/.ssh/id_rsa.pub $uname\@$ip 2>&1 1>/dev/null");
我遇到的问题是:ssh-copy-id 命令需要相当长的时间才能将密钥复制到远程系统。所以,当这个 Perl 脚本运行时,它看起来就像脚本挂起一样。
因此,我想显示“进度消息”:当复制正在进行时,我想显示“SSH 身份验证密钥复制正在进行中”,如果复制失败,则显示“复制失败”,如果它已成功,显示“复制成功”。
我该怎么做呢?
还有一个(基于 Chas 的回答):
我按照 Chas 的建议尝试了代码
死“不能分叉:$!”除非定义(我的 $pid = fork);
#child 休眠然后以随机退出代码退出
除非 ($pid) {
打印“连接到服务器”;
exec "ssh-copy-id -i /root/.ssh/id_rsa.pub $uname\@$ip 2>&1 1>/dev/null";
退出 int rand 255;
}
#parent 等待孩子完成
$| = 1;
打印“等待:”;
我的@throbber = qw/。哦哦哦。 /;
直到 ($pid = waitpid(-1, WNOHANG)) {
#获取下一帧
我的 $frame = shift @throbber;
#display it<br />
print $frame;
#把它放在帧列表的末尾
推@throbber, $frame;
#wait a quarter second<br />
select undef, undef, undef, .25;<br />
#backspace over the frame<br />
print "\b";<br />
}
问题是这样的:
现在 ssh-copy-id 在连接到远程服务器时要求输入密码。因此,“throbber”输出(即显示的不同大小的圆圈)出现在看起来很奇怪的密码输入之后。这是它的样子:
电流输出
连接到远程服务器 o0O0o #这是 throbber。输出看起来并不完全像这样,但我无法打印动态变化的输出,可以吗
密码:o0O0oXXXXXo0O0o #你没看错,跳动者也不必要地出现在密码提示符下
我想要的输出:
连接到远程服务器 o0O0o #悸动者应该只显示在这里,其他地方都没有
密码:XXXXX
有什么想法吗?
【问题讨论】:
-
将 ssh 密钥复制到某个远程系统可能需要多长时间?甚至通过拨号线路?
-
@Manni 您显然从未遇到过 dns-reverse-lookup 和 GSSAPIAuthentication 问题。我不得不坐下来等待一段时间才能连接。
-
我的 .ssh/config 文件顶部附近的一行显示“GSSAPIAuthentication no”是有原因的。