我有一个脚本,它应该将日志条目写入另一台服务器上的日志文件。脚本在服务器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 # >
有谁知道我做错了什么?
任何帮助将不胜感激!感谢。
答案 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"
非常感谢!