因此,我的部分内容如下:
ssh user@$remoteServer "
cd ~/a/b/c/;
echo -e 'blah blah'
sleep 1 # Added this just to make sure it waits.
foo=`grep something xyz.log |sed 's/something//g' |sed 's/something-else//g'`
echo $foo > ~/xyz.list
exit "
在我的输出中,我看到:
grep: xyz.log: No such file or directory
blah blah
当我ssh到服务器时,xyz.log确实存在于〜/ a / b / c /
中为什么grep语句在echo语句之前执行?
有人可以帮忙吗?
答案 0 :(得分:4)
这里的问题是你的反引号命令正在本地运行,而不是在SSH连接的远程端运行。因此,它甚至可以在您连接到远程系统之前运行! (对于以双引号运行的所有扩展都是如此,因此$foo
中的echo $foo
也是如此。
使用引用的heredoc来保护您的代码免受本地评估:
ssh user@$remoteServer bash -s <<'EOF'
cd ~/a/b/c/;
echo -e 'blah blah'
sleep 1 # Added this just to make sure it waits.
foo=`grep something xyz.log |sed 's/something//g' |sed 's/something-else//g'`
echo $foo > ~/xyz.list
exit
EOF
如果你想从本地传递一个变量,那么简单的方法是使用位置参数:
printf -v varsStr '%q ' "$varOne" "$varTwo"
ssh "user@$remoteServer" "bash -s $varsStr" <<'EOF'
varOne=$1; varTwo=$2 # set as remote variables
echo "Remote value of varOne is $varOne"
echo "Remote value of varTwo is $varTwo"
EOF
答案 1 :(得分:1)
[命令服务器] ------&gt; [远程服务器]
更好的方法是在&#34;远程服务器&#34;中创建shell脚本。 ,并在&#34;命令服务器中运行命令&#34;如:
ssh ${remoteserver} "/bin/bash /foo/foo.sh"
它将解决许多问题,目的是使事情简单但不复杂。