Rubyでsudo su - #{su_user}
の後に複数のnet-sshコマンドを送信する方法を理解しようとしています。Rubyでsudo suをnet-sshする方法
私の現在のコードは、send_data "#{password}\n"
の後であっても、sudo su
コマンドでハングアップします。
一方、システムでは、sudo su - admin2
の手動実行では、パスワードを入力する必要はありません。
助けていただけたら幸いです!
Rubyでsudo su - #{su_user}
の後に複数のnet-sshコマンドを送信する方法を理解しようとしています。Rubyでsudo suをnet-sshする方法
私の現在のコードは、send_data "#{password}\n"
の後であっても、sudo su
コマンドでハングアップします。
一方、システムでは、sudo su - admin2
の手動実行では、パスワードを入力する必要はありません。
助けていただけたら幸いです!
require 'rubygems'
require 'net/ssh'
host = 'hostA'
user = 'admin'
password = 'hostA_pwd'
su_user = 'Admin2'
Net::SSH.start(host, user, :password => password) do |ssh|
ssh.open_channel do |channel|
channel.request_pty do |c, success|
raise "could not request pty" unless success
channel.exec "pwd; whoami; sudo su - #{su_user} ; pwd ; whoami"
channel.on_data do |c_, data|
if data =~ /\[sudo\]/ || data =~ /Password/i
channel.send_data "#{password}\n"
else
result << data
end
end
puts result
end
end
ssh.loop
end
sudo
サブシェルにコマンドを渡す-c
オプションをサポートしています。
-c, --command=COMMAND
pass a single COMMAND to the shell with -c
--session-command=COMMAND
pass a single COMMAND to the shell with -c and do not create a new session
-m, --preserve-environment
do not reset environment variables
-s, --shell=SHELL
run SHELL if /etc/shells allows it
だから、sudo su someuser -c 'ls;date'
のようなものを使用して、あなたはコマンドls
とsomeuser
としてdate
を実行します:ここではあなたに役に立つかもしれないsudo
フラグの一部です。そのホスト上のコマンドラインで試してみて、あなたができることを感じてから、あなたのSSHセッションにそれを適用してください。
詳細については、man sudo
を参照してください。
また、単にコーディングのヒントとして、あなたは減らすことができます。
if data =~ /\[sudo\]/ || data =~ /Password/i
をする:
if (data[/\[sudo\]|Password/i])
返信ありがとう、私はTin Manが推奨するように-cオプションを含むようにコードの行を修正しました。ありがとう。
channel.exec "pwd; whoami; sudo -u#{su_user} sh -c 'whoami; cd/tmp; pwd; ls'" –
これはsudo su someuserの下で-c 'コマンド'よくそれは素晴らしいヒントでした。 – wallerjake
あなたは 'sudo'コマンドの後にそのようなチェーンのコマンドではないことを認識していますか?最後の 'pwd; whoamiはsudoコマンドシェルが復帰するまで実行されません。あなたはこれを考慮に入れましたか? – Casper