如何通过SSH获取填写的变量以进行发送

时间:2014-11-12 11:14:18

标签: bash ssh

我有一个脚本,它应该将日志条目写入另一台服务器上的日志文件。脚本在服务器SRV1上运行,并应将条目写入服务器SRV2。该条目在日志文件中变为wirtten,但变量中的内容为空。

NODE_NAME="SRV1"
BUILD_NUMBER="10"

test() {
  ssh SRV2 'echo `date +"%d-%m-%Y %H:%M:%S"` "${NODE_NAME} #${BUILD_NUMBER} > $1" | tee -a /var/lib/jenkins/logs/packaging.log'
}


test "testmessage"

当我在SRV2上的日志文件上运行tail -f时,以下日志文​​件中只有空条目:

12-11-2014 11:15:45  # >
12-11-2014 11:15:45  # >
12-11-2014 11:19:21  # >
12-11-2014 11:19:21  # >
12-11-2014 11:22:12  # >
12-11-2014 11:22:12  # >

有谁知道我做错了什么?

任何帮助将不胜感激!感谢。

2 个答案:

答案 0 :(得分:0)

单引号内的命令在您要连接的计算机上运行。在单引号内,参数将按字面顺序传递,然后在该机器上展开。您需要通过用双引号括起命令来扩展本地计算机上的参数:

ssh SRV2 "echo \"$(date +'%d-%m-%Y %H:%M:%S')\" '${NODE_NAME} #${BUILD_NUMBER} > $1'  | tee -a /var/lib/jenkins/logs/packaging.log"

命令替换的转义双引号意味着date命令的输出也将被视为单个单词。这通常被认为是良好的做法,因为它避免了分词和全局扩展的问题。我已经修改了您的命令以使用首选的$()语法而不是反引号,因为这些被广泛认为已被弃用。

字符串其余部分的单引号确保shell不会解释任何字符,而是按字面打印。

答案 1 :(得分:0)

我终于明白了。这是我的解决方案脚本:

NODE_NAME="SRV1"
BUILD_NUMBER="10"

test() {
  ssh SRV2 "echo \"$(date +'%d-%m-%Y %H:%M:%S')\" '${NODE_NAME}' '#${BUILD_NUMBER}' '> ${1}' | tee -a /var/lib/jenkins/logs/packaging.log"
}


test "testmessage"

非常感谢!