我正在尝试使用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"
这个有效!非常感谢!
感谢。
答案 0 :(得分:3)
在将参数发送到远程计算机之前,Bash将评估所有带双引号的变量。
如果要保留$variable
,则需要使用单引号(在命令中转义单引号),或者转义要在服务器端评估的所有美元符号。
您也不需要转义换行符并使用分号。所有换行符都将包含在参数中。