pythonshell命令-为什么获胜';这不管用吗?

pythonshell命令-为什么获胜';这不管用吗?,python,shell,Python,Shell,我想知道是否有人对此有任何见解。我有一个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

我想知道是否有人对此有任何见解。我有一个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

我做错了什么?我尝试转义最里面的引号,但错误消息相同。。。提前感谢您的回答。

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

您正在启动一个Python解释器——但随后,通过
os.system
,告诉Python解释器启动一个shell<代码>操作系统在现代Python中根本不应该使用(
子流程
是一个完全的替代品)。。。但是在这种用例中,使用任何启动shell实例的Python调用都是非常愚蠢的

现在,从实际的、直接的问题来看——看看引号是如何嵌套的。您将看到您在
mkdir
之前开始的报价在
echo
中被关闭,从而允许您的命令被拆分到您不想要的位置

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


您有一个严重的问题-
os.system
的运行方式与您期望的不同-,但是,您应该认真地重新思考整个方法

您正在启动一个Python解释器——但随后,通过
os.system
,告诉Python解释器启动一个shell<代码>操作系统在现代Python中根本不应该使用(
子流程
是一个完全的替代品)。。。但是在这种用例中,使用任何启动shell实例的Python调用都是非常愚蠢的

现在,从实际的、直接的问题来看——看看引号是如何嵌套的。您将看到您在
mkdir
之前开始的报价在
echo
中被关闭,从而允许您的命令被拆分到您不想要的位置

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

阿格!所以这是引用。。。我想我也可以做“…”…\“…\”…“…”,但我一时被来自web的bash解决方案搞糊涂了,它使用了两组嵌套的双引号。。。无论如何,谢谢你的劝告。我将继续阅读subprocess.Arg!所以这是引用。。。我想我也可以做“…”…\“…\”…“…”,但我一时被来自web的bash解决方案搞糊涂了,它使用了两组嵌套的双引号。。。无论如何,谢谢你的劝告。我将继续阅读子流程。
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()
})