如何在Ruby中执行Expect的“交互”功能?

时间:2019-03-05 19:34:20

标签: ruby ssh interactive

我想产生一个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交互?

2 个答案:

答案 0 :(得分:0)

如果还没有,请在命令提示符下安装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命令。

答案 1 :(得分:0)

我无法发表评论,因此发布为答案,因为我使用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

如果要记录会话的输出,可以使用tee命令将输出通过管道传输到日志文件,例如 sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no username@$IP | tee -a logfile.log