0

SSHを使用するためにRubyでシェルアウトしようとしています。SSH モジュールがあることは知っていますが、使用したくありません。不格好で紛らわしいと思います。

私はSSHを非常にうまくシェルアウトして使用することができます。ただし、誰かがいくつかの提案を提供してくれることを望んでいたという不満が1つあります。

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 を実行すると、パスワードは表示されません。

ルビーで同じことをすると、パスワードがエコーされます:

%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

Ruby のOpen3.popen3またはを使用してみてくださいOpen3.capture3sshしかし、 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

実行すると、パスワードがチャネルで「puts」であっても、sshプロンプトが表示stdinされ、パスワードを入力すると出力が続きます。

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 に答える