关于linux:如何使用参数在ssh上执行远程命令?

How to execute a remote command over ssh with arguments?

在我的.bashrc中,我定义了一个函数,稍后我可以在命令行中使用它:

1
2
3
function mycommand() {
    ssh user@123.456.789.0 cd testdir;./test.sh"$1"
}

使用此命令时,仅在远程主机上执行cd命令;在本地主机上执行test.sh命令。这是因为分号分隔了两个不同的命令:ssh命令和test.sh命令。

我试图定义如下函数(注意单引号):

1
2
3
function mycommand() {
    ssh user@123.456.789.0 'cd testdir;./test.sh"$1"'
}

我试图把cd命令和test.sh命令放在一起,但是$1的论点没有得到解决,与我给函数的内容无关。它总是试图执行一个命令

1
./test.sh $1

在远程主机上。

如何正确定义mycommand,使脚本test.sh在切换到目录testdir后,在远程主机上执行,能够把给mycommand的参数传递给test.sh


改为这样做:

1
2
3
function mycommand {
    ssh user@123.456.789.0"cd testdir;./test.sh "$1""
}

您仍然需要将整个命令作为单个字符串传递,但是在该单个字符串中,您需要在发送到ssh之前扩展$1,因此需要使用""

更新

另一个正确的方法实际上是使用printf %q正确地引用论点。即使参数有空格、单引号、双引号或对shell有特殊意义的任何其他字符,也可以安全地进行解析:

1
2
3
4
function mycommand {
    printf -v __ %q"$1"
    ssh user@123.456.789.0"cd testdir;./test.sh $__"
}
  • 当用function声明函数时,不需要()
  • 不要仅仅因为你是一个姿态主义者就对它发表评论。


恢复一个旧的线程,但这个相当干净的方法没有列出。

1
2
3
4
5
function mycommand() {
    ssh user@123.456.789.0 <<+
    cd testdir;./test.sh"$1"
+
}


这是一个在AWS云上工作的示例。场景是,一些从自动缩放启动的机器需要在另一台服务器上执行一些操作,通过ssh传递新生成的实例dns

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Get the public DNS of the current machine (AWS specific)
MY_DNS=`curl -s http://169.254.169.254/latest/meta-data/public-hostname`


ssh \
    -o StrictHostKeyChecking=no \
    -i ~/.ssh/id_rsa \
    user@remotehost.example.com \
<< EOF
cd ~/
echo"Hey I was just SSHed by ${MY_DNS}"
run_other_commands
# Newline is important before final EOF!

EOF

我正在使用以下命令从本地计算机远程执行命令:

1
ssh -i ~/.ssh/$GIT_PRIVKEY user@$IP"bash -s" < localpath/script.sh $arg1 $arg2