我想做的是在...内运行命令
su - someuser -c "ssh someplace \"if ( ! grep <b>[WHAT DO I PUT HERE?]</b>some thing<b>[WHAT DO I PUT HERE]</b> /etc/somefile ); then doSomething; fi\""
这是 grep 字符串的那些引号让我感到困惑,我现在会通过 grep 查找不带空格的内容来解决它,但我宁愿 grep 查找我想要 grep 的内容。
答案1
加三个引号没有用,你只能取消引号、引用、再取消引号。你也不需要子 shell。
你真正想要的是:
su - someuser -c 'ssh someplace "if ! grep \"some thing\" /etc/somefile; then doSomething; fi"'
这种方法很快就会变得笨拙——考虑只在服务器上放置一个脚本并执行它。这将使您远离嵌套引用地狱。
答案2
您可以只使用此处的文档。
su -someuser -c '<&1 >&2 ssh you@machine sh' 1<<\SCRIPT
if ! grep 'some spaces or whatever' /etc/somefile
then : do something
fi
#END
SCRIPT
该解决方案需要一点 fd 杂耍,因为您需要通过从 读取的初始密码su
,并且su
不会传递任何高于 2 的文件描述符。但是一旦您进行了身份验证su
,ssh
就不会搞砸 i/o 和这样您就可以立即进行重新分配,并让另一端调用的 shell 读取 stdin。