SSH Shell Script вывод нескольких команд - PullRequest
3 голосов
/ 09 августа 2011

Grettings,

Я хочу выполнить 2 команды для ssh в сценарии оболочки и извлечь вывод на мой локальный компьютер

пример

ssh user @ host "command1"> /local/1.txt

ssh user @ host" command2 "> /local/2.txt

Я хочу это, но с одним соединением это возможно

пожалуйста, не отвечайте с "Ожидайте" решения ...

Большое спасибо;)

Ответы [ 3 ]

3 голосов
/ 09 августа 2011

Если вы не против использовать один и тот же файл для хранения выходных данных;затем:

ssh user@host "command1; command2" > /local/1-2.txt

Если это имеет значение, попробуйте что-то вроде этого:

ssh user@host "command1 > /somepath/1.txt; command2 > /somepath/2.txt; ..."
scp user@host:/somepath/*.txt somelocalpath/

Если вам все еще нужно только одно соединение, возможно, это может работать для вас:

ssh user@host "command1; echo "this_is_a_separator"; command2" > /local/1-2.txt
sed -n '1,/this_is_a_separator/ {p}' /local/1-2.txt > /local/1.txt
sed -n '/this_is_a_separator/,$ {p}' /local/1-2.txt > /local/2.txt

Локальное разбиение файла может быть выполнено несколькими другими способами, это был только один из них.

1 голос
/ 09 августа 2011

Редактировать : не работает, если вывод command1 не заканчивается новой строкой.

Редактировать : также не работает, если одна или обе команды не выдают результат.Нужен более гибкий инструмент -> awk.См. Другое решение.

Чтобы сделать то же самое, что и:

ssh user@host "command1" > /local/1.txt
ssh user@host "command2" > /local/2.txt

в одном соединении и без временного файла, вы можете сделать:

ssh user@host "command1 | sed -e 's/^/1/' ; command2 | sed -e 's/^/2/'" | \
sed -n -e '/^1/{s/^.//;w /local/1.txt
};/^2/{s/^.//;w /local/2.txt
}'

Вам нужноновые строки после /local/1.txt и /local/2.txt, потому что если их там нет, sed будет продолжать думать, что вы пишете имя файла.

0 голосов
/ 09 августа 2011

Поскольку предыдущее решение с sed не работает из-за обработки конца строки, в этом решении используется awk.

Так сделать так же:

ssh user@host "command1" > /local/1.txt
ssh user@host "command2" > /local/2.txt

в одном соединении и без временного файла вы можете сделать:

ssh user@host "command1 | sed -e 's/^/1/'; echo -e '\na'; command2 | sed -e 's/^/2/'; echo" | \
awk -v f1=/local/1.txt -v f2=/local/2.txt \
'BEGIN{state=0; printf "" > f1}
/^1/ {printf "%s%s", state == 1 ? "\n" : "", substr($0, 2) > f1; state=1}
/^$/ && state == 1 {printf "\n" > f1}
/^a$/ {state=2; close (f1); printf "" > f2}
/^2/ {printf "%s%s", state == 3 ? "\n" : "", substr($0, 2) > f2; state=3}
/^$/ && state == 3 {printf "\n" > f2}
END{close (f2)}'
...