2013-12-12 21 views
0

我有一种情况,因为我必须登录到远程系统并获取它们的硬件信息。 我登录到他们的系统我已经使用ssh为此我使用net-ssh gem。 这里是我的代码,我登录和查看信息在ruby中使用net :: ssh使用sudo命令获取远程系统的信息

Net::SSH.start('host','user', :password => 'xxxxxx') do |ssh| 
    ssh.exec!("echo 'xxxxxx' | sudo -S dmidecode -s system-serial-number") 
end 

为得到我已经使用sudo -S dmidecode -s system-serial-number命令 它是作为密码用户1.0.0给人以密码输出为用户信息 我如何删除该消息?

我提到这个link但我也实现了它,但它会花费很多时间来加载他们是如何做到这一点的他们的任何其他方式?

result = nil 
    session.exec!("sudo -S dmidecode -s system-serial-number") do |channel, stream, data| 
    if data =~ /^\[sudo\] password for user:/ 
     channel.send_data 'your_sudo_password' 
    else 
     result << data 
    end 
    result 

d

回答

0

须藤故意试图防止这种以提高安全性。理想的解决方案是在sudoers文件中添加一个NOPASSWD选项,以获取您需要的命令,以及用于创建ssh连接的用户名。 例如: THESSHUSER ALL = NOPASSWD:dmidecode,系统序列号

但是,请替换具有完全绝对路径的命令。另外,不要只为所有命令提供ssh用户NOPASSWD,将其限制为要运行的命令,否则会降低系统的安全性。 sudoers文件通常位于/ etc/sudoers中,并在许多机器上用特殊命令编辑,该命令为visudo,必须以root身份运行(即使用sudo;)。一旦你编辑了sudoers文件,你可以在不提示输入密码的情况下运行这些命令。

+0

感谢快速反应。但他们是数百个系统,我们必须登录并获取他们的系统信息。我无法更改他们的文件。 – r15

0

不能完全确定是什么问题,但也许你想尝试使用-p切换到密码提示更改为空字符串:

ssh.exec!("echo 'xxxxxx' | sudo -p '' -S dmidecode -s system-serial-number") 
-p The -p (prompt) option allows you to override the default password 
    prompt and use a custom one.