gpt4 book ai didi

ruby - 如何在 Ruby 中使用 net-ssh sudo su

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

我正在尝试弄清楚如何在 Ruby 中的 sudo su - #{su_user} 之后发送多个 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

最佳答案

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

因此,使用 sudo su someuser -c 'ls;date' 之类的东西,您将执行命令 lsdate 一些用户。在该主机上的命令行中尝试一下以了解您可以做什么,然后将其应用于您的 SSH session 。

有关详细信息,请参阅 man sudo

此外,作为编码技巧,您可以减少:

if data =~ /\[sudo\]/ || data =~ /Password/i

到:

if (data[/\[sudo\]|Password/i])

关于ruby - 如何在 Ruby 中使用 net-ssh sudo su,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13704836/

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