在ruby内部使用%x进行SSH调用

在ruby内部使用%x进行SSH调用,ruby,string,bash,ssh,awk,Ruby,String,Bash,Ssh,Awk,我正在尝试从ruby脚本进行单行ssh调用。我的脚本获取一个主机名,然后开始返回主机名的机器信息 return_value = %x{ ssh #{hostname} "#{number_of_users}; #{number_of_processes}; #{number_of_processes_running}; #{number_of_processes_sleeping}; "} 变量的格式如下 number_of_users = %Q(users |

我正在尝试从ruby脚本进行单行ssh调用。我的脚本获取一个主机名,然后开始返回主机名的机器信息

return_value = %x{ ssh #{hostname} "#{number_of_users}; #{number_of_processes}; 
              #{number_of_processes_running}; #{number_of_processes_sleeping}; "}
变量的格式如下

number_of_users = %Q(users | wc -w | cat | awk '{print "Number of Users: "\$1}')

number_of_processes = %Q(ps -el | awk '{print $2}' | wc -l  | awk '{print "Number of Processes: "$1}')
我已经尝试了%q、%q和简单的“”,但我无法让awk在输出之前打印任何内容。我要么得到这个错误(如果我包括冒号)

awk:第1行:在或附近出现语法错误:


或者如果我没有在$1前面加上斜杠,我只会得到该行的空输出。有什么解决办法吗?我想这可能是因为我使用了%q,但它甚至只用了双引号

使用反勾号捕获命令的输出并将输出作为字符串返回:

number_of_users = `users | wc -w | cat | awk '{print "Number of Users:", $1}'`

puts number_of_users
我的系统上的结果:

48
但您可以改进您的管道:

users | awk '{ print "Number of Users:", NF }'

ps -e | awk 'END { print "Number of Processes:", NR }'

因此,这个问题的解决方案是:

%q(users | wc -w | awk '{print \"Number of Users: \"\$1}')
必须使用
%q
、非
%
、非
%q
和非
您必须在任何awk变量前面反斜杠双引号和美元符号

如果有人能通过解释原因来改进这个答案,那将是非常感激的

尽管正如Steve指出的那样,我本可以使用
users | awk'{print\“users:\”,NF}'

在这种情况下,就不需要反斜杠了。

谢谢你,我猜我可以改进我在上面使用的很多命令,比如
ps-el | awk'{print$2}'| grep'R'| wc-l | awk'{print'运行的进程数:“$1}”“
grep'model name'/proc/cpuinfo|uniq|cut-d:-f2|cut-d@-f1|awk'{print“model name:$0}'”
,但它并没有真正回答我的问题。