Открывая много туннелей, набирая пароль только один раз (все учетные записи в шлюзах имеют один и тот же пароль)

В <<< "$ ( (поддерживается zsh (где <<< ] впервые был введен, вдохновленный тем же оператором в порту Unix rc ), ksh93 (оператор $ ( был введен ksh ), mksh и bash ),

Для $ ( оболочка считывает содержимое файла (блокирует NUL байтов, кроме для zsh ), удаляет все завершающие символы новой строки, что приводит к расширению $ ( (таким образом, содержимое файла сохраняется в памяти как единое целое).

Для <<< some-text оболочка сохраняет some-text , за которым следует один символ новой строки, во временный файл, и открывает этот временный файл в файловом дескрипторе 0.

Таким образом, в основном <<< "$ ( открывает стандартный ввод для чтения во временной копии файла , где конечные символы новой строки были заменены только одним (и с различные виды неправильного поведения, если файл содержит байты NUL, кроме zsh ).

В то время как в <файл , это файл , который напрямую открывается для чтения на стандартном вводе.

Конечно, намного эффективнее (не требует копирования на диск и в память), но можно использовать <<< "$ (, чтобы убедиться, что файл, открытый на stdin, является обычным файлом, или чтобы убедиться, что файл был полностью прочитан к моменту запуска команды (в случае, если эта команда записывает в него, например ) или обрабатывается другое перенаправление (например, такое перенаправление, которое усекает файл , как в tr 1 2 <<< "$ ( file ).

Обратите внимание, что yash поддерживает оператор <<< (хотя реализует его с конвейером (а не с обычным файлом ) вместо временного файла). . но не $ (. Вместо этого вы можете использовать <<< "$ (cat . yash строки являются только символами, поэтому "$ (cat подавится последовательностями байтов, которые не образуют допустимые символы, в то время как другие оболочки обычно могут нормально справляться с их.

1
25.06.2018, 13:43
1 ответ

Я нашел решение, используяhttps://stackoverflow.com/a/3980904/1424395иhttps://unix.stackexchange.com/a/59632/269821

Я использую read -sдля ввода пароля в переменную, а затем использую sshpassдля передачи пароля в ssh.

#!/usr/bin/env bash

# Read Password
echo -n Password:
read -s password
echo

sshpass -p $password ssh -fN -p 22 usr1@gate1 -L 10001:ip1:22
sshpass -p $password ssh -fN -p 22 usr2@gate2 -L 10002:ip2:22
...
sshpass -p $password ssh -fN -p 22 usrn@gaten -L 1000n:ipn:22
0
28.01.2020, 00:33

Теги

Похожие вопросы