意外重定向 /bin/sh: 1:
Redirection unexpected /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
作为 shell 可能不是 Bash 所以它可能不理解 <<<
重定向语法。如果你想使用 Bash 那么你可以这样尝试:
command = 'source /etc/openconnect/cfgfile.conf; ...'
# explicitly use bash
output = check_output(['bash', '-c', command])
而且您似乎使用 <<<
语法向 openconnect
命令发送密码。这可能不会像您预期的那样工作。出于安全原因,一个设计良好的程序默认不会从 stdin 读取密码。相反,它会直接从 /dev/tty
读取密码。不确定 openconnect
是否有特殊的 cmdline 选项,因此您可以通过 stdin(或 --password <passwd>
等选项)传递密码。如果没有,您需要使用 Python 库,例如 pexpect.
我收到此错误:
/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
作为 shell 可能不是 Bash 所以它可能不理解 <<<
重定向语法。如果你想使用 Bash 那么你可以这样尝试:
command = 'source /etc/openconnect/cfgfile.conf; ...'
# explicitly use bash
output = check_output(['bash', '-c', command])
而且您似乎使用 <<<
语法向 openconnect
命令发送密码。这可能不会像您预期的那样工作。出于安全原因,一个设计良好的程序默认不会从 stdin 读取密码。相反,它会直接从 /dev/tty
读取密码。不确定 openconnect
是否有特殊的 cmdline 选项,因此您可以通过 stdin(或 --password <passwd>
等选项)传递密码。如果没有,您需要使用 Python 库,例如 pexpect.