Sys*_*RJR 6 ruby sudo su net-ssh
我试图弄清楚如何sudo su - #{su_user}在Ruby 之后发送多个net-ssh命令的发送链.
我当前的代码在下面,并挂起sudo su命令,即使在之后send_data "#{password}\n".
同时,在系统上,手动执行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
Run Code Online (Sandbox Code Playgroud)
sudo支持-c将命令传递到子 shell 的选项。以下是一些sudo可能对您有用的标志:
-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
Run Code Online (Sandbox Code Playgroud)
因此,使用类似 的东西sudo su someuser -c 'ls;date',您将执行命令ls和dateas someuser。在该主机上的命令行中尝试一下,了解您可以做什么,然后将其应用到您的 SSH 会话。
请参阅man sudo获取更多信息。
另外,正如编码技巧一样,您可以减少:
if data =~ /\[sudo\]/ || data =~ /Password/i
Run Code Online (Sandbox Code Playgroud)
到:
if (data[/\[sudo\]|Password/i])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3879 次 |
| 最近记录: |