我编写了一个 bash 脚本,该脚本应该接受输入,连接到远程服务器,并使用给定的输入运行一系列命令。它最终会比这复杂得多,但这里有一个非常简单的例子:
#!/bin/bash
NAME=$1
echo $NAME
ssh user@server "ls $NAME"
如果我将文件名硬编码到 bash 脚本的 ssh 命令中,我会得到响应,如果我在命令行中键入这些确切的行,将 $NAME 设置为我的文件名,我会得到正确的响应,但传入的组合文件名到脚本并尝试返回“ls”会返回一个错误,指出“没有这样的文件或目录”。它确实回显了我给它的文件名,因此它被正确存储在 $NAME 中。我究竟做错了什么?
答案1
如果$NAME
包含由 shell 以某种方式扩展的字符(例如空格或$
),那么您将遇到麻烦。你必须逃离他们。这样很快就得到非常毛茸茸。为了满足所有情况,您必须将文件名放入复制到远程的文件中,然后使用内容作为命令的参数。就像是:
NAME="$1"
TMPF=/tmp/tmpf-$$ # If you have mktemp then use that instead
printf %s "$NAME" >$TMPF
scp "$TMPF" user@server:$TMPF
ssh user@server "ls \"$(cat $TMPF)\""