使用Net :: SSH Ruby库来执行需要sudo su的远程命令 - 另一个用户

时间:2012-12-13 13:38:43

标签: shell ssh remote-access net-ssh rundeck

我的环境使用SSH无密码身份验证为用户配置 节点服务器(Rundeck服务器)和节点目标(远程Solaris主机)之间的“主”。

在目标上,我想与用户/app/acme/stopApp.sh执行脚本appmanager

通常,当我需要手动运行脚本时,我使用:

ssh master@server sudo su - appmanager

或简单地说:

ssh -t master@server 'sudo su - appmanager'

在没有密码的情况下工作,最后运行(作为appmanager):

/app/acme/stopApp.sh

但是我无法弄清楚如何使用Net :: SSH重现这些步骤。 当我执行sudo su - appmanager然后/app/acme/stopApp.sh时, 我是在子shell中做的,对吧?

require 'rubygems'
require 'net/ssh'
require 'net/scp'
require 'crypt/blowfish'
require 'yaml'

#
# ...
#

Net::SSH.start( host, user, :password => password ) do |session|

  # It's possible to proceed in this way?
  cmd = 'sudo su - appmanager;/app/acme/stopApp.sh'  
  ses = session.exec!( cmd )

end

我意识到如果我尝试执行类似于我在目标服务器上的内容:

sudo su -c /app/acme/stopApp.sh appmanager

我收到以下信息:

We trust you have received the usual lecture from the local System Administrator. 

It usually boils down to these three things: 

 #1) Respect the privacy of others. 
 #2) Think before you type. 
 #3) With great power comes great responsibility. Password:

Password:

1 个答案:

答案 0 :(得分:1)

这是一个系统管理员的回答,但我认为你要进行两次身份验证:一次以“master”身份登录(使用master的密钥对),然后第二次“master”su su su to to to appmanager“但使用密码(因此”讲座“消息)。但我认为你第二次没有回答密码质询。我想到了一些解决这个问题的方法:

1)使用该帐户的密钥对直接登录appmanager。如果您担心appmanager帐户的安全性,可以restrict ssh remote commands等。

2)作为master,将not a script!的二进制文件(setuid)称为“appmanager”,它只调用stopApp.sh脚本。一个example

3)将master所在的适当组设置为/ etc / sudoers中的NOPASSWD