我想通过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([
)错误且参数太多)
我怎样才能解决这个问题?你有什么想法?请帮帮我。
谢谢,
答案 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
的输出,在文件名有空格/换行符等情况下,这可能容易出错。