我在公司使用OpenVPN,并且正在尝试使用户创建过程自动化。我现在面临的证书生成步骤存在问题。尝试为用户构建键(所有参数都是预定义的)时,程序必须多次按Enter键,最后两次“ y”和“ Enter”键。我尝试使用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”即可。
答案 0 :(得分:0)
您无法source
使用Python编写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