2013-04-05 209 views
1

我正在尝试使用SSH运行多个命令,但我没有得到我的语法。有人能给我一些帮助吗?通过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" 

这工作!非常感谢!

谢谢。

回答

3

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

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

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

+0

谢谢乔纳森,我已经取得了进展。我现在明白了这个想法。我现在有一个问题,因为我有本地变量(在本地bash脚本中),一个远程变量(CURRENT_HOSTNAME)和sed抱怨双引号。我正在更新上面的代码。 – user1777907 2013-04-05 18:14:27

+0

我得到了工作代码(编辑中的解决方案)。非常感谢乔纳森! – user1777907 2013-04-05 18:44:45