Как использовать ssh с несколькими переходами, используя пароли?

Команда findдолжна иметь способ сообщить, где заканчивается команда, которая должна быть выполнена через -exec. Без ;в конце команды findне знал бы, где заканчивается команда и где продолжаются (, возможно, )другие флаги find.

Бессмысленный пример, который выполняет basenameдля всех файлов и lsдля всех каталогов:

find. '(' -type f -exec basename {} ';' ')' -o '(' -type d -exec ls {} ';' ')'

Без ;выше, findне знал бы, следует ли выполнять basename /some/pathили basename /some/path ')' -o '('...и т. д.

Заключение или экранирование ;делается только для того, чтобы оболочка не рассматривала его как разделитель команд.

Менее бессмысленный пример, который сначала копирует .txtфайлы в определенный каталог, а затем переименовывает исходные файлы, добавляя .doneк их имени (, если копирование прошло нормально):

find. -type f -name '*.txt'
    -exec cp {} /some/path/dest ';' \
    -exec mv {} {}.done ';'

(Обратите внимание, как отмечает Элиа Каган в комментариях, что конструкция {}.doneстрого говоря не является переносимой, а определяется реализацией . Реализация может решить не расширять символы {}до текущего имени пути, а может и сделать. По моему опыту, все findреализации делают расширение {}до текущего имени пути, даже если оно объединено с другой строкой, подобной этой.)

Без ;в предыдущем примере findне знал бы, хотим ли мы выполнить команду cpдля найденного файла вместе с /some/path/dest, файл с именем -exec, mvи т. д.

1
10.04.2020, 20:19
2 ответа

Есть несколько способов сделать это. Быстрый и грязный способ, который я бы использовал, - это туннелировать из server1 -> server2, а затем использовать этот туннель, чтобы перейти server1 -> server3

.
ssh -L localhost:2222:server3:22 server2

Здесь мы говорим:
ssh для server2...
любой трафик, который появляется на L локальной стороне туннеля на локальном порту 2222...
пропустить через туннель..
на дальней стороне, отправить этот трафик на порт server3 22

Затем из другого окна:

ssh -p2222 localhost

Вам будет предложено ввести пароль на server3.

1
19.03.2021, 02:30

Вы должны использовать опцию -tс каждым последующим ssh, кроме последнего:

ssh -t user1@server1 ssh -t user2@server2 ssh user3@server3

Если возможно, лучше использовать-J(ProxyJump)вместо встроенных ssh-команд:

ssh -J user1@server1,user2@server2 user3@server3
0
19.03.2021, 02:30

Теги

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