`ssh`执行和格式化中的变量

时间:2012-12-18 12:47:37

标签: bash shell ssh

我正在编写一个shell脚本,我需要SSH到服务器,执行一些操作,然后退出。

为此,我使用的代码如下:

ssh -t username@server '
cd uploads/; \
tar -xvzf torrent.tar.gz; \
'

但是,我需要使用这样的变量:

DIR="uploads/";

ssh -t username@server '
cd $DIR; \
tar -xvzf torrent.tar.gz; \
'

这似乎不起作用,因为显然在建立SSH连接之前不会执行cd,到那时就没有$DIR变量(我的猜测)。但是,有什么方法可以使用变量吗?

也许更好的问题是,在建立SSH连接后,是否有更好的方法可以布置我的脚本来执行操作?我必须小心,逃避撇号,并且有时我实际上是从SSH连接内部连接到另一台服务器。这是丑陋的代码!

修改:请注意,如果我使用“而不是”,该变量将起作用。但我的问题仍然是格式化?

3 个答案:

答案 0 :(得分:0)

而不是单引号(')为什么不使用双引号(“),那么应该扩展$ DIR

答案 1 :(得分:0)

使用双引号允许扩展。例如试试这个:

echo "$DIR"

vs

echo '$DIR'

并注意结果。

值得将它包装在shell脚本中:

#!/bin/bash -x
# ...

并且-x将输出shell扩展等。它使生活变得非常容易调试。

您可以使用heredoc,而不是使用上述方法输入命令。 e.g。

ssh username@host <<EOF
ls
EOF

将在远程主机上执行'ls'。

答案 2 :(得分:0)

我想你必须写:

   ssh username@server "( cd $DIR; tar -xvzf torrent.tar.gz; )"

这应该在连接后执行.. 如果没有尝试使用(“而不是”(和obviusly然后关闭