在ssh上执行back-quote命令

时间:2015-10-02 06:29:40

标签: shell ssh

我想通过ssh在远程服务器上执行命令,但是如果我执行以下shell脚本,则命令在本地服务器上执行。

#!/bin/bash

cat << EOF > "cmd.txt"
  if [ `ls -1U "/home/" | wc -l` -gt "0" ]; then
    echo "not empty!"
  fi
EOF
cmd=`cat "cmd.txt"`
rm "cmd.txt"

ssh root@127.0.0.1 "${cmd}"

它确实发生的原因是在将变量传递给ssh选项之前对back-quote(``)命令进行了评估。

我也尝试使用单引号('')或大括号({})引用,如下所示:

if [ '`ls -1U "/home/" | wc -l`' -gt "0" ]; then

if [ {`ls -1U "/home/" | wc -l`} -gt "0" ]; then

但结果是相同的。(并且没有``将是测试命令&#39; s([)错误且参数太多) 我怎样才能解决这个问题?你有什么想法?请帮帮我。

谢谢,

2 个答案:

答案 0 :(得分:3)

将命令放在脚本中并通过ssh远程执行:

ssh root@127.0.0.1 'bash -s' < script.sh

只要没有包含环境变量,就可以正常工作。

答案 1 :(得分:1)

您不需要预先构建命令并将其存储在文件中。您可以直接将here-doc与ssh一起使用,如下所示:

ssh -t -t root@127.0.0.1 <<'EOF'
if [ $(ls -1U /home/ | wc -l) -gt 0 ]; then
    echo "not empty!"
fi
exit
EOF

另外需要注意的是,你正在解析ls的输出,在文件名有空格/换行符等情况下,这可能容易出错。