当前位置:  开发笔记 > 编程语言 > 正文

python shell命令 - 为什么它不起作用?

如何解决《pythonshell命令-为什么它不起作用?》经验,为你挑选了1个好方法。

我想知道是否有人对此有任何见解.我有一个bash脚本,应该将我的ssh密钥放到远程计算机上.从这里采用,脚本读,

#!/usr/bin/sh
REMOTEHOST=user@remote
KEY="$HOME/.ssh/id_rsa.pub"
KEYCODE=`cat $KEY`
ssh -q $REMOTEHOST "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "$KEYCODE" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"

这有效.等效的python脚本应该是

#!/usr/bin/python
import os
os.system('ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "%(KEYCODE)s" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"' %
          {'REMOTEHOST':'user@remote',
           'KEYCODE':open(os.path.join(os.environ['HOME'],
                                       '.ssh/id_rsa.pub'),'r').read()})

但在这种情况下,我明白了

sh: line 1:  >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys: No
such file or directory

我究竟做错了什么?我试图逃避最内层的引用,但同样的错误信息...提前感谢您的回复.



1> Charles Duff..:

你有一个严肃的问题 - 那os.system就是你没有按照你期望的方式行事 - 但是,你应该认真地重新思考这个方法.

你正在启动一个Python解释器 - 然后,通过os.system告诉Python解释器启动一个shell!os.system在现代Python中根本不应该使用它(subprocess完全替代)...但是在这种用例中使用任何启动shell实例的Python调用都是非常愚蠢的.

现在,就实际的,直接的问题而言 - 看看你的引号是如何嵌套的.您将看到之前启动的引用mkdir正在关闭echo,允许您将命令拆分到您不想要的位置.

以下修复了这个直接问题,但仍然非常糟糕(不必要地启动子shell,没有正确检查输出状态,应该转换为使用subprocess.Popen()):

os.system('''ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo '%(KEYCODE)s' >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"''' % {
  'REMOTEHOST':'user@remote',
  'KEYCODE':open(os.path.join(os.environ['HOME'], '.ssh/id_rsa.pub'),'r').read()
})

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有