Bash 如何填写SSH发送的变量

Bash 如何填写SSH发送的变量,bash,ssh,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/pa

我有一个脚本,可以将日志条目写入另一台服务器上的日志文件。脚本在服务器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  # >
有人知道我做错了什么吗


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

单引号内的命令在您连接的机器上运行。在单引号中,参数将按字面形式传递,然后在该机器上展开。您需要在本地计算机advance上展开中的参数,方法是将命令用双引号括起来:

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不会解释任何字符,而是按字面意思打印。

我终于找到了答案。这是我的解决方案脚本:

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"

非常感谢

非常感谢你的回答。我几分钟前测试过,但它不起作用。我没有收到错误消息,但我也没有控制台上的输出或日志文件中的条目。我使用了你在回答中建议的命令。你自己测试过了吗?我想问题在于tee的使用。您正在将echo的输出重定向到
$1
的值,因此应该没有输出到stdout。你想用tee做什么?我的想法是把日志消息写到中央jenkins服务器。jenkins服务器也有一个web gui,在那里您可以看到运行脚本(SRV1)的服务器的控制台输出。使用tee,我试图将日志消息发送到SRV1的控制台,并发送到jenkins服务器(SRV2)上的集中式日志文件中。这对你有意义吗?我想是的。我已经编辑了我的答案,以便SRV2将输出回显到控制台,并将其附加到日志文件中。我不确定
$1
的用途是什么-您没有提到如何调用您的函数(这将是在本地计算机上传递给
test
的第一个参数)。我调用我的函数,就像问题
test“log message”
中提到的那样<代码>$1应包含应发送到控制台和日志文件的日志消息。