0

我正在尝试在 Ruby 中使用 SSH。我知道有一个 SSH 模块,但我不想使用它。我觉得它笨拙且令人困惑。

我能够很好地使用 SSH。然而,我有一个抱怨,我希望有人能提供一些建议。

在 Bash 中,我可以这样做:

echo "PASSWORD" | ssh SERVER "sudo -S cat /etc/sudoers"

当我执行 ps -ef 时,它会显示为:

USER    8212  8837  0 09:31 pts/7    00:00:00 ssh SERVER sudo -S cat /etc/sudoers

执行 ps -ef 时不显示密码。

当我在 ruby​​ 中做同样的事情时,它正在回显密码:

%x[echo "#{password}" | ssh -q -o BatchMode=yes SERVER "sudo -S cat /etc/sudoers 2>/dev/null"].split("\n")

使用 ps -ef 在服务器上显示:

sh -c echo "PASSWORD" | ssh -q -o BatchMode=yes SERVER "sudo -S cat /etc/sudoers 2>/dev/null"
4

1 回答 1

0

尝试使用 RubyOpen3.popen3Open3.capture3. 但是,我认为它不会起作用,因为ssh它不接受来自 STDIN 的密码,并且会重新连接来自键盘的输入,至少这是我在 CentOS 和 Mac OS 上遇到的行为。

这里有一些代码来测试它:

require 'open3'

host = 'myhost'
user = 'myname'
password = 'mypassword'

stdin, stdout, stderr, wait_thr = Open3.popen3(ENV, %Q[ssh #{host} "cat /home/#{user}/.bash_profile"])
pid = wait_thr[:pid]
stdin.puts password
stdin.close

puts stdout.read
stdout.close

puts stderr.read
stderr.close

exit_status = wait_thr.value

运行它会显示 ssh 提示,即使stdin通道上的密码是“puts”,然后在我输入密码后输出:

myname@myhost's password: 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

# User specific environment and startup programs
set editing-mode vi

# complete -W "$(echo $(grep '^ssh ' .bash_history | sort -u | sed 's/^ssh //'))" ssh
complete -W "$(echo $(grep '^ssh ' .bash_history | sort -u | sed 's/^ssh //' | sed 's/^.+@//'))" ssh

PATH=$HOME/bin:$PATH

export PATH
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

虽然Net::SSH可能“笨拙”,但它旨在让您在 ssh 中干净利落地解决此问题。我们在内部广泛使用 Net::SSH,它非常适合我们的需求。

于 2013-01-23T17:18:19.677 回答