gpt4 book ai didi

Ruby,通过 SSH 和 LOG 一条一条地运行 linux 命令

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:28 28 4
gpt4 key购买 nike

我想用 Ruby witch net::ssh 编写代码,在远程 linux 机器上一条一条地运行命令并记录所有内容(在 linux 机器上称为命令、stdout 和 stderr)。

所以我写函数:

  def rs(ssh,cmds)
cmds.each do |cmd|
log.debug "[SSH>] #{cmd}"
ssh.exec!(cmd) do |ch, stream, data|
log.debug "[SSH:#{stream}>] #{data}"
end
end
end

例如,如果我想在远程 linux 上创建新文件夹和文件:“./verylongdirname/anotherlongdirname/a.txt”,并在该目录中列出文件,并在那里找到 firefox(有点愚蠢 :P)所以我这样调用上面的程序:

Net::SSH.start(host, user, :password => pass) do |ssh|  

cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname; mkdir anotherlongdirname, \ #2
"cd verylongdirname/anotherlongdirname; touch a.txt", \ #3
"cd verylongdirname/anotherlongdirname; ls -la", \ #4
"cd verylongdirname/anotherlongdirname; find ./ firefox" #5 that command send error to stderr.
]

rs(ssh,cmds) # HERE we call our function

ssh.loop
end

运行上面的代码后,我将在第 #1、#2、#3、#4、#5 行中获得关于执行命令的完整日志信息。问题是 linux 上的状态,在 cmds 数组的执行命令之间,没有保存(所以我必须在运行正确的命令之前重复“cd”语句)。我对此并不满意。

我的目的是拥有这样的 cmds 表:

  cmds=["mkdir verylongdirname", \     #1
"cd verylongdirname", \
"mkdir anotherlongdirname", \ #2
"cd anotherlongdirname", \
"touch a.txt", \ #3
"ls -la", \ #4
"find ./ firefox"] #5

如您所见,运行每个命令之间的状态保存在 linux 机器上(并且我们不需要在运行正确的命令之前重复适当的“cd”语句)。如何更改“rs(ssh,cmds)”程序来执行此操作并像以前一样记录所有内容(comand、stdout、stdin)?

最佳答案

也许可以尝试使用 ssh channel 来打开远程 shell。这应该在您的命令之间保留状态,因为连接将保持打开状态:

http://net-ssh.github.com/ssh/v1/chapter-5.html

这里还有一篇用稍微不同的方法做类似事情的文章:

http://drnicwilliams.com/2006/09/22/remote-shell-with-ruby/

编辑 1:

好的。我明白你在说什么。 SyncShell 已从 Net::SSH 2.0 中删除。但是我发现了这个,它看起来与 SyncShell 所做的差不多:

http://net-ssh-telnet.rubyforge.org/

例子:

s = Net::SSH.start(host, user)
t = Net::SSH::Telnet.new("Session" => s, "Prompt" => %r{^myprompt :})
puts t.cmd("cd /tmp")
puts t.cmd("ls") # <- Lists contents of /tmp

Net::SSH::Telnet 是同步的,并保留状态,因为它在您的远程 shell 环境的 pty 中运行。请记住设置正确的提示检测,否则 Net::SSH::Telnet 将在您调用它时出现挂起(它正在尝试查找提示)。

关于Ruby,通过 SSH 和 LOG 一条一条地运行 linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6806176/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com