1

我正在尝试使用 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"

这行得通!非常感谢!

谢谢。

4

1 回答 1

3

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

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

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

于 2013-04-05T18:07:32.167 回答