Команда 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
и т. д.
Есть несколько способов сделать это. Быстрый и грязный способ, который я бы использовал, - это туннелировать из server1 -> server2
, а затем использовать этот туннель, чтобы перейти server1 -> server3
ssh -L localhost:2222:server3:22 server2
Здесь мы говорим:
ssh для server2
...
любой трафик, который появляется на L локальной стороне туннеля на локальном порту 2222...
пропустить через туннель..
на дальней стороне, отправить этот трафик на порт server3 22
Затем из другого окна:
ssh -p2222 localhost
Вам будет предложено ввести пароль на server3.
Вы должны использовать опцию -t
с каждым последующим ssh
, кроме последнего:
ssh -t user1@server1 ssh -t user2@server2 ssh user3@server3
Если возможно, лучше использовать-J
(ProxyJump
)вместо встроенных ssh-команд:
ssh -J user1@server1,user2@server2 user3@server3