python - 重定向意外 /bin/sh: 1:
问题描述
我收到此错误:
/bin/sh: 1: Syntax error: redirection unexpected
Traceback (most recent call last):
File "vpntest.py", line 24, in <module>
output = check_output(command, shell=True)
File "/usr/lib/python2.7/subprocess.py", line 223, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'source /etc/openconnect/dsn-dsmc.conf; openconnect -b -u ${USER} --cafile=${CACERT} --certificate=${CERT} --sslkey=${KEY} ${HOST} <<< $PASS;ping 8.8.8.8 -w 5; ip addr; echo $?' returned non-zero exit status 2
这是我的代码:
import subprocess
import argparse
import sys
from subprocess import check_output
def parse_args(argv):
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--user", action="store",
help="User for login",
dest="user")
parser.add_argument("-p", "--pwd", action="store",
help="Password",
dest="pwd")
args = parser.parse_args()
return args
args = parse_args(sys.argv[1:])
command = 'source /etc/openconnect/cfgfile.conf; openconnect -b -u ${USER} --cafile=${CACERT} --certificate=${CERT} --sslkey=${KEY} ${HOST} <<< $PASS;ping 8.8.8.8 -w 5; ip addr; echo $?'
output = check_output(command, shell=True)
我试过改变:
command = 'source /etc/openconnect/cfgfile.conf; openconnect -b -u ${USER} --cafile=${CACERT} --certificate=${CERT} --sslkey=${KEY} ${HOST} <<< $PASS;ping 8.8.8.8 -w 5; ip addr; echo $?'
为了
command = '#!/bin/bash source /etc/openconnect/cfgfile.conf; openconnect -b -u ${USER} --cafile=${CACERT} --certificate=${CERT} --sslkey=${KEY} ${HOST} <<< $PASS;ping 8.8.8.8 -w 5; ip addr; echo $?'
但是当我尝试打印命令或输出时,它不显示任何结果,只显示空格。
解决方案
check_output(command, shell=True)
用作/bin/sh
可能不是 Bash 的 shell,因此它可能无法理解<<<
重定向语法。如果你想使用 Bash,那么你可以这样尝试:
command = 'source /etc/openconnect/cfgfile.conf; ...'
# explicitly use bash
output = check_output(['bash', '-c', command])
而且您似乎正在使用语法向openconnect
命令发送密码。<<<
这可能无法按您的预期工作。出于安全原因,设计良好的程序默认不会从标准输入读取密码。相反,它会直接从/dev/tty
. 不确定是否openconnect
有特殊的 cmdline 选项,因此您可以通过标准输入(或类似的选项)传递密码--password <passwd>
。如果没有,您需要使用 Python 库,例如pexpect。
推荐阅读
- c# - Entity Framework Core - 按值列表过滤
- jquery - 如何使用 AJAX 上传图片
- javascript - Chrome v90 flex 滚动错误
- reactjs - 测试异步动作创建者时输入错误,我不明白创建者和单元模拟之间的区别
- docker - 是否可以将 tomee 与更新版本的 tomcat 一起使用?
- c++ - 使用迭代器 C++ 修改对象时遇到问题
- python - 在 PyFMI 中联合仿真两种联合仿真类型的 FMU
- java - 在 Springdoc 中未禁用 Petstore url(swagger 默认应用程序)
- python - 如何接受“任何整数”作为 Python 中的条件?
- php - 用于本地 PHP 开发的 Docker:覆盖 $_SERVER 变量