如何在Ruby中执行Expect的“交互”等效操作?

问题描述 投票:0回答:2

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

ruby ssh interactive
2个回答
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命令。


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

如果要记录会话的输出,可以使用像sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no username@$IP | tee -a logfile.log这样的tee命令将输出传递给日志文件

© www.soinside.com 2019 - 2024. All rights reserved.