Py学习  »  DATABASE

在远程计算机上执行mysql查询[重复]

karra • 6 年前 • 978 次点击  

我正在构建一组用于远程启动、停止和检查进程状态的脚本。这个 stop 其中的脚本应该寻找一个进程并终止它。因此我要:

ssh deploy@hera 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '{print $2}' | head -n 1`'

这里的问题是awk标记化步骤需要单引号,并且这些引号与用于通过ssh执行远程命令的单引号冲突。这些单引号如何转义?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40765
文章 [ 5 ]  |  最新文章 6 年前
Pipo
Reply   •   1 楼
Pipo    8 年前

另一个例子是处理简单或双引号,因为对我来说,我需要解释和变量替换。如果我想制作一个函数来向我女人的macos显示msg,我可以执行以下操作:

ssh womanLptp "osascript -e 'tell app \"System Events\" to display dialog \"${1}\"'"
Community Robert Harvey
Reply   •   2 楼
Community Robert Harvey    8 年前

还有两个选项我在其他答案中都没有提到。为了演示的目的,我保留了grep/grep/awk/head管道的完整性(如 rici's answer )它可以简化为

awk -F ' ' '/MapReduceNod[e]/ {print $2; exit}'
  1. 对整个ssh命令使用双引号:

    ssh deploy@hera "kill -9 \$(ps -ef |
    grep MapReduceNode | grep -v \"grep\" | awk -F ' ' '{print \$2}' | head -n 1)"
    

    请注意,我现在可以在命令中使用单引号,但我必须避开其他尚未展开的内容: \$() (我用它代替了反勾号),双引号 \" print \$2 .

  2. 带引号分隔符的here文档:

    ssh -T deploy@hera <<'EOF'
    kill -9 $(ps -ef | grep MapReduceNode | grep -v 'grep' |
    awk -F ' ' '{print $2}' | head -n 1)
    EOF
    

    这个 -T 防止ssh抱怨没有分配伪终端。

    带引号分隔符的here文档是非常好的,因为它的内容根本不需要对转义内容进行修改, 它可以包含单引号。

rici
Reply   •   3 楼
rici    12 年前

不能在单引号字符串中包含单引号。但是,这并不重要,因为一个参数可以有多个带引号的段(只要没有未带引号的空格或其他自定界字符)。

例如:

ssh deploy@hera 'kill -9 `ps -ef |
                 grep MapReduceNode |
                 grep -v "grep" |
                 awk -F " " '\''{print $2}'\'" |
                 head -n 1`"

但是,该命令行是 非常 笨拙的如果可能,您应该使用 pkill 公用事业,这将减少所有这些 ssh deploy@hera 'pkill -SIGKILL MapReduceNode' .

否则,您可以在一个 awk 调用(未经测试,但我认为它会工作):

ssh deploy@hera 'ps -ef |
                 awk "/[M]apReduceNode/{system(\"kill -9 \"$2)}"'

(与原始任务不同,这将杀死所有mapreducenode任务,而不是任意的第一个任务。如果你真的想在一个任务中完成,添加 ; exit 到awk动作。)

Yann Vernier
Reply   •   4 楼
Yann Vernier    12 年前

这不是 ssh awk 处理引号时,它就是shell(而且它们必须防止shell处理其他字符,特别是 $ )。不支持嵌套它们(尽管其他结构,如 $() 甚至在包含引号时也可以嵌套),因此需要分别转义单引号。以下是几种方法:

$ echo 'Don'"'"'t mess with this apostrophe!'
Don't mess with this apostrophe!
$ echo 'Don'\''t mess with this apostrophe!'
Don't mess with this apostrophe!
RedX
Reply   •   5 楼
RedX    12 年前

使用

ssh deploy@hera 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '"'"'{print $2}'"'"' | head -n 1`'