0

我正在编写一个 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; \
'

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

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

编辑:请阅读,如果我使用“而不是”,该变量将起作用。但是我的问题仍然是关于格式的?

4

3 回答 3

0

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

于 2012-12-18T12:49:27.777 回答
0

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

echo "$DIR"

对比

echo '$DIR'

并注意结果。

值得将其包装在 shell 脚本中,因此:

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

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

您可以使用heredoc,而不是使用上述方法来输入命令。例如

ssh username@host <<EOF
ls
EOF

将在远程主机上执行“ls”。

于 2012-12-18T12:49:39.727 回答
0

我想你必须写:

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

这应该在连接后执行..如果不尝试使用("而不是"(并且显然然后关闭

于 2012-12-18T12:52:31.653 回答