我在bash上有脚本,我为用户生成了用户名,密码和ssh-key。 创建ssh-key的部分:
su $user -c "ssh-keygen -f /home/$user/.ssh/id_rsa -t rsa -b 4096 -N ''"
如何使用os.system
在Python中执行相同的操作?我试过这个:
os.system('su %s -c "ssh-keygen -f /home/%s/.ssh/id_rsa -t rsa -b 4096 -N ''"', user)
TypeError: system() takes at most 1 argument (2 given)
我也试过了:
os.system('su user -c "ssh-keygen -f /home/user/.ssh/id_rsa -t rsa -b 4096 -N ''"')
当然,它也不起作用。
答案 0 :(得分:1)
使用os
包格式化您的说明;例如:
import os
user = 'joe'
ssh_dir = "/home/{}/.ssh/id_rsa".format(user)
os.system("ssh-keygen -f {} -t rsa -b 4096 -N ''".format(ssh_dir))
答案 1 :(得分:1)
使用子流程模块:
import subprocess
username = 'user'
result, err = subprocess.Popen(
'su %s -c "ssh-keygen -f /home/%s/.ssh/id_rsa -t rsa -b 4096 -N ''"' % (username, username),
stdout=subprocess.PIPE,
shell=True
).communicate()
if err:
print('Something went wrong')
else:
print(result)
编辑:这是'快速'要做到这一点,如果您无法控制输入,则不应使用shell=True
,因为它允许执行代码here
答案 2 :(得分:1)
os.system
非常靠近bash
命令行,因为它使用了底层shell(就像它的堂兄subprocess.call
...使用shell=True
)
在你的情况下,使用subprocess
没有什么兴趣,因为你的命令运行命令,所以你不能真正完全使用subprocess
的参数保护。
传递确切的命令,但唯一的变化是保护简单的引号,否则python认为字符串结束+字符串开始(你的字符串已经被简单的引号保护)并且它们被消除了。
检查这个更简单的例子:
>>> 'hello '' world'
'hello world'
>>> 'hello \'\' world'
"hello '' world"
这是一种最糟糕的情况,因为你不能使用双重或简单的引号来保护字符串,因为你正在使用其他的味道。在这种情况下,使用\
:
os.system('su $user -c "ssh-keygen -f /home/$user/.ssh/id_rsa -t rsa -b 4096 -N \'\'"')