运行不带引号的 ssh 命令

运行不带引号的 ssh 命令

您可以使用以下命令在远程服务器上执行命令

ssh user@host 'the command'

但有没有办法在不带引号的情况下执行命令?

(我使用 BSD 并使用 OpenSSH)

答案1

这取决于命令。一般来说,当将命令传递到远程计算机时,有必要对该命令中通常由本地 shell 解释的任何字符进行转义。冒着过度概括的风险,如果本地 shell 没有尝试解释的字符,那么很可能不需要引号。其推论是,如果 shell 字符被正确转义(以便本地 shell 不会解释它们),则可以重写原本需要引号的命令,以便它不需要引号。

考虑尝试将远程系统的日期捕获到远程系统上date.out用户的主目录中命名的文件中。使用引号实现这一点的一种方法是:userhost

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

相关内容