Правильный способ показать, какие SSH-команды вы используете - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь передать массив команд на устройство NID через SSH, а затем сохраняю вывод в переменную.Я не могу найти эффективный способ показать, какая команда выполняется в выводе.

Я могу заставить ее работать, зациклив массив и выполнив 7 отдельных сессий SSH.Что очень медленно.

n_info=$(sshpass -p "-PW-" ssh -q -o StrictHostKeyChecking=false admin@$nid_ip << EOF
        ${c_array[0]}
        ${c_array[1]}
        ${c_array[2]}
        ${c_array[3]}
        ${c_array[4]}
        ${c_array[5]}
        ${c_array[6]} 
        exit
EOF
)
        echo "$i"
        echo "$n_info"| sed "s/ACCEDIAN:>//g"

Ожидается:

[show log]

log text 

log text 

log text 

[show config]

config text

config text

config text

Факт:

log text 

log text 

log text 

config text

config text

config text

Команды не являются статичными **

1 Ответ

0 голосов
/ 06 февраля 2019

Самое простое / чистое решение, если это возможно, это запустить команды echo для nid.Предполагая, что заголовки не содержат специальных символов оболочки:

sshpass -p "-PW-" ssh -q -o StrictHostKeyChecking=false admin@$nid_ip << EOF
    echo '[${h_array[0]}]'; ${c_array[0]}
    echo '[${h_array[1]}]'; ${c_array[1]}
    echo '[${h_array[2]}]'; ${c_array[2]}
    echo '[${h_array[3]}]'; ${c_array[3]}
    echo '[${h_array[4]}]'; ${c_array[4]}
    echo '[${h_array[5]}]'; ${c_array[5]}
    echo '[${h_array[6]}]'; ${c_array[6]} 
    exit
EOF | sed "s/ACCEDIAN:>//g"

Если вы используете openssh в качестве клиента ssh, у него есть опции для использования одного управляющего соединения.Что-то вроде:

REMOTE="admin@$nid"

CP_DIR="/tmp/sshctl/$$"
CP="$CP_DIR/"%L-%r@%h:%p"
mkdir -p "$CP_DIR"

sshpass -p "-PW-" \
ssh -q -nNf -o ControlMaster=yes -o ControlPath="${CP}" \
    -q -o StrictHostKeyChecking=false "$REMOTE"

# !!! check you have a connection !!!
# it may work to wrap "sshpass ..." with "if ! sshpass ...; then do_error; fi"

(
    for i in {0..6}; do
        echo "[$h_array[$i]}]"
        ssh -o ControlPath="${CP}" \
            -q -o StrictHostKeyChecking=false "$REMOTE" "${c_array[$i]}"
    done
    ssh -O exit -o ControlPath="$CP" "$REMOTE"
) | sed "s/ACCEDIAN:>//g"

rm -r "$CP_DIR"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...