引用:循环ssh帐户,在远程服务器上调用psql

引用:循环ssh帐户,在远程服务器上调用psql

这在人脑中有效,但 shell 忽略了引用:

for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done

如何在不失去可读性的情况下引用这一行?

答案1

您需要转义引号。将它们视为传递包裹游戏中的层层包裹。每个外壳都会打开一个“层”。

所以:

echo "this ; is a semicolon"

但如果你想通过 ssh 运行它:

ssh $user@$host echo "this ; is a semicolon"

SSH将打开包裹的第一层 - 发送:

echo this ; is a semicolon

这会破坏,因为分号是由 shell 解释的。

因此,要做到这一点,您需要首先转义引号 - 这样 ssh 才能安全地“解开”一层:

ssh $user@$host echo "\"this ; is a semicolon\""

因此,ssh 将剥离“外层”和“转义层”并通过:

echo "this ; is a semicolon"

这将是您需要为您的一个班轮做的事情。至于不失去可读性 - 恐怕说起来容易做起来难,因为转义和引用嵌套不可避免地会变得混乱。

我能提供的最好的办法是使用一个变量来封装你的 SQL 语句,这样至少可以清楚地知道你正在发送一个“封装的语句”:

THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO

相关内容