社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

karra • 4 年前 • 630 次点击  

我正在构建一组用于远程启动、停止和检查进程状态的脚本。这个 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
 
630 次点击  
文章 [ 5 ]  |  最新文章 4 年前
Pipo
Reply   •   1 楼
Pipo    7 年前

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

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

还有两个选项我在其他答案中都没有提到。为了演示的目的,我保留了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    10 年前

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

例如:

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    10 年前

这不是 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    10 年前

使用

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