我想生成一个SSH会话,响应密码提示登录,然后与远程系统交互。使用Expect很容易做到这一点,但我发现在Ruby中这样做很有挑战性。
在Expect中,我只是做了类似的事情:
log_user 0
spawn ssh user@host
expect "assword" { send "my_password\r" }
interact
但是,Ruby IO#expect方法不会提供我所追求的交互性。我也正在阅读Net::SSH documentation,但是在成功登录后还没有找到一种明显的方法来使会话具有交互性。
成功打开连接后,需要什么才能使远程主机上的TTY / PTY交互?
如果还没有,请在命令提示符下安装net-ssh
gem。
gem install net-ssh
这是一个代码片段,用于处理SSH身份验证,然后连接到您选择的任何远程主机的IP地址。
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
HOST = '192.168.1.113'
USER = 'username'
PASS = 'password'
Net::SSH.start( HOST, USER, :password => PASS ) do|ssh|
result = ssh.exec!('ls')
puts result
end
在连接到远程主机之后,会话应该是“交互式的”,但就我而言,这并不等同于Expect的Interact。这里有几个链接,涵盖了Ruby的内置TTY和PTY模块:https://piotrmurach.github.io/tty/ http://ruby-doc.org/stdlib-2.6.1/libdoc/pty/rdoc/PTY.html。您将不得不在Ruby终端上为TTY执行另一个gem install
命令。
我无法评论,所以发布作为答案,因为我使用sshpass实用程序做同样的事情(如果你没有你可以轻松安装)
#!/bin/ksh
IP=yourIP
ping -c 1 $IP
if [ $? -gt 0 ]
then
echo "$IP not reachable."
exit
else
echo "$IP is reachable"
fi
sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no username@$IP
如果要记录会话的输出,可以使用像sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no username@$IP | tee -a logfile.log
这样的tee命令将输出传递给日志文件