【问题标题】:SSH call inside ruby, using %xruby 内部的 SSH 调用,使用 %x
【发布时间】:2013-02-18 08:57:44
【问题描述】:

我正在尝试从 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: line 1: syntax error at or near :

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

【问题讨论】:

    标签: ruby string bash ssh awk


    【解决方案1】:

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

    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 }'
    

    【讨论】:

    • 谢谢,我猜我可以改进我使用上面的东西使用的很多命令,比如ps -el | awk '{print $2}' | grep 'R' | wc -l | awk '{print "Number of Processes Running: " $1}'grep 'model name' /proc/cpuinfo | uniq | cut -d: -f2 | cut -d@ -f1 | awk '{print "Model Name: " $0}',但它并没有真正回答我的问题问题。
    【解决方案2】:

    所以这个问题的解决方法是:

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

    你必须使用%q,而不是%,不是%Q,而不是"" 您必须在任何 awk 变量前使用反斜杠双引号和美元符号

    如果有人可以通过解释原因来改进这个答案,那将不胜感激

    尽管史蒂夫指出我可以使用 users | awk '{ print \"Number of Users:\", NF }' 改进我的代码 在这种情况下,不需要反斜杠 NF。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2021-09-08
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多