Большая часть этого может быть достигнута с помощью одной команды и, следовательно, может можно поместить в псевдоним:
ssh -t server1 sudo -u user2 ssh server2
Однако сменить каталог сложнее. Если вы можете гарантировать, что user2
всегда должен попадать в ваш целевой каталог, вы можете поместить cd dirOnServer2
в свой .profile
(или .bash_profile
]) следующим образом:
cd dirOnServer2
Имейте в виду, что смена каталога произойдет только в том случае, если будет получен .profile
, и это происходит только для интерактивной оболочки.
Один из способов — настроить доступ без пароля (аутентификацию с открытым ключом ), другой — мультиплексировать соединения. Создайте файл конфигурации в ~/.ssh/config
со следующим:
Host remote_host
User user
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist 5m
Создать каталог~/.ssh/controlmasters/
:
mkdir -m 700 ~/.ssh/controlmasters/
Затем, когда вы запускаете скрипт, он должен запросить пароль только один раз, а все остальные команды будут выполняться через то же, уже аутентифицированное соединение.
Если вам не разрешено создавать доступ без пароля с помощью :ssh-keygen user@remotehost
, вы можете установить обычный инструмент expect
,и создайте скрипт с именемpassexpect
:
#!/usr/bin/expect -f
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
log_user 0
eval spawn $cmd
expect "assword:"
send "$password\r";
interact
затем в основном сценарии оболочки вы можете прочитать пароль один раз:
printf "ssh password:" >&2; read -s pass; printf "\n">&2
и используйте его в любой команде ssh:
passexpect $pass ssh user@remotehost command_for_remote_host
или для ваших целей полный сценарий будет:
#/usr/bin/env bash
printf "ssh password:" >&2; read -s pass; printf "\n">&2
./passexpect $pass ssh user@remotehost cat remoteF1.txt | diff - localF1.txt
./passexpect $pass ssh user@remotehost cat remoteF2.txt | diff - localF2.txt