我在我的公司使用OpenVPN,并尝试自动化用户创建过程。我现在面临的证书生成步骤存在问题。当尝试为用户构建密钥(所有参数都是预定义的)时,程序必须多次按Enter键,最后按“y”和“Enter”2次。我尝试过使用Popen和PIPE,但到目前为止还没有运气。非常感谢任何见解。
import sys, os
from subprocess import Popen, PIPE
# Generate an .ovpn file
try:
username = sys.argv[1]
except:
print "Error. Supply a username!"
sys.exit()
print("Adding user")
os.system("useradd" + " -m" + " -s" + " /bin/bash" + username)
print("Sourcing vars")
os.system('source + /home/myuser/openvpn-ca/vars')
enter = Popen(['/home/myuser/openvpn-ca/build-key {}'.format(username)]),
stdin=PIPE, shell=True)
enter.communicate(input='\n')
编辑:
这与标记为[重复]的内容不同。原因如下:
我不需要生成自定义证书,更改任何值等。只需要多次按“Enter”并输入“yes”和“Enter”2次。
你不能用Python来source
一个shell脚本;或者更确切地说,你可以,但它只是启动一个新的子进程,sources
的东西,然后消失,而不会改变你的Python环境或后续子进程中的任何东西。
尝试这样的事情:
import sys
import logging # to get diagnostics on standard error instead
import subprocess
# Maybe switch to level=logging.WARNING once you are confident this works
logging.basicConfig(level=logging.INFO, format='%(module)s:%(asctime)s:%(message)s')
try:
username = sys.argv[1]
except:
logging.error("Error. Supply a username!")
sys.exit()
logging.info("Adding user")
subprocess.run(["useradd", "-m", "-s", "/bin/bash", username],
check=True, universal_newlines=True)
logging.info("Building key")
subprocess.run('''
source /home/myuser/openvpn-ca/vars
/home/myuser/openvpn-ca/build-key {}'''.format(username),
shell=True, check=True, input='\n\n', universal_newlines=True)
切换到subprocess.run()
需要一个相当新版本的Python 3.在旧版本中,subprocess.check_call()
会做大致相同的事情,但没有input=
参数,所以你真的必须使用基本的Popen()
。
补充说明:
source
之后的加号显然是语法错误check=True
来确保Python检查命令是否成功完成。os.system()
与subprocess
不是一个错误,但肯定是一个可疑的代码气味。(很多)更多关于在U * x上使用subprocess
:https://stackoverflow.com/a/51950538/874188