使python3程序多次按“输入”

时间:2019-03-11 05:51:02

标签: python linux openvpn

我在公司使用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”即可。

1 个答案:

答案 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