通过ssh运行多个命令

时间:2013-04-05 17:32:59

标签: bash

我正在尝试使用SSH运行多个命令,但我的语法不正确。有人可以给我一些帮助吗?

ssh "$USER"@"$IP" " \
    CURRENT_HOSTNAME=$(hostname); \
    sed -c -i 's/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/' $DISTRO_FILE; \
    sed -c -i 's/$CURRENT_HOSTNAME/$REPLACEMENT_VALUE/' $CONFIG_FILE; \
    hostname $REPLACEMENT_VALUE"

如果这些命令在本地运行,那么这些命令可以正常工作,但是当我尝试通过SSH运行它时,我收到以下错误:

sed: -e expression #1, char 0: no previous regular expression

似乎错误来自

sed -c -i 's/$CURRENT_HOSTNAME/$REPLACEMENT_VALUE/' $CONFIG_FILE; \

因为它正在尝试读取之前在SSH本身中设置的$ CURRENT_HOSTNAME。我不知道如何阅读该变量。有什么线索吗?

编辑代码:

ssh "$USER"@"$IP" "CURRENT_HOSTNAME=\$(hostname);
    sed -c -i \"s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/\" $DISTRO_FILE;
    sed -c -i \"s/\$CURRENT_HOSTNAME/$REPLACEMENT_VALUE/\" $CONFIG_FILE;
    hostname $REPLACEMENT_VALUE"

这个有效!非常感谢!

感谢。

1 个答案:

答案 0 :(得分:3)

在将参数发送到远程计算机之前,Bash将评估所有带双引号的变量。

如果要保留$variable,则需要使用单引号(在命令中转义单引号),或者转义要在服务器端评估的所有美元符号。

您也不需要转义换行符并使用分号。所有换行符都将包含在参数中。