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