您可以使用以下命令在远程服务器上执行命令
ssh user@host 'the command'
但有没有办法在不带引号的情况下执行命令?
(我使用 BSD 并使用 OpenSSH)
答案1
这取决于命令。一般来说,当将命令传递到远程计算机时,有必要对该命令中通常由本地 shell 解释的任何字符进行转义。冒着过度概括的风险,如果本地 shell 没有尝试解释的字符,那么很可能不需要引号。其推论是,如果 shell 字符被正确转义(以便本地 shell 不会解释它们),则可以重写原本需要引号的命令,以便它不需要引号。
考虑尝试将远程系统的日期捕获到远程系统上date.out
用户的主目录中命名的文件中。使用引号实现这一点的一种方法是:user
host
ssh user@remote 'date > date.out'
不带引号运行该命令的错误尝试可能是:
ssh user@remote date > date.out
这会导致本地 shell 处理> date.out
简单地保留远程 ssh 命令date
。该date
命令是远程运行的,但其输出保存在本地。为了避免这种情况,需要转义该>
符号:
ssh user@remote date \> date.out
运行该命令后,我们可以继续执行第二个示例。让我们使用带引号的命令检查输出文件ls
及其cat
内容:
ssh user@remote 'ls -l date.out; cat date.out'
未加引号的命令:
ssh user@remote ls -l date.out; cat date.out
仅远程运行ls
命令。该cat
命令在本地执行,因为本地 shell 将分号字符解释为两个命令之间的分隔符。
要正确运行不带引号的命令,可以使用:
ssh user@remote ls -l date.out\; cat date.out
当人们想要在命令中使用变量或参数扩展时,类似的规则也适用。如果变量是在本地环境中定义的,则通常不需要引号(或转义符)。如果本地用户alex
发出命令:
ssh user@remote echo $USER
输出将为alex
,因为 $USER 的本地值在发送到远程主机之前已扩展为 ssh 命令。如果命令是双引号:
ssh user@remote "echo $USER"
结果是相同的,因为本地 shell 将在用双引号引起来时扩展变量。但是,任一命令:
ssh user@remote 'echo $USER'
或者
ssh user@remote echo \$USER
将打印user
,因为字符串的扩展$USER
是由远程主机完成的,而不是本地 shell 完成的。
答案2
就在这里:
$ ssh host.example.com echo this is a test
this is a test