Неожиданное перенаправление / bin / sh: 1: - PullRequest
0 голосов
/ 03 августа 2020

Я получаю эту ошибку:

/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 $?'

Но когда я пытаюсь распечатать команду или вывод, он не показывает никаких результатов, только пробелы.

1 Ответ

1 голос
/ 03 августа 2020

check_output(command, shell=True) использует /bin/sh в качестве оболочки, которая может отличаться от 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 библиотеки, например .

...