首页 > 解决方案 > 重定向意外 /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 $?'

但是当我尝试打印命令或输出时,它不显示任何结果,只显示空格。

标签: pythonlinuxbashvpnopenconnect

解决方案


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 库,例如


推荐阅读