Bu benim genel amacım ssh
sarıcı. Seçenek yok ya da adres kodlanmış. Ayarlamanız gereken tek şey ssh
, 3. satırdaki yürütülebilir dosya yolunuzdur (kullanabilirsiniz executable=ssh
, tam yolu seçtim). Tam kodumu aşağıda bulacaksınız.
Diyelim ki puanlarınızı, çalıştırılabilir kıldığınız nokta sshmt
("ssh, multi target") olarak kaydettiğiniz . Ardından sözdizimini tanıyın:$PATH
chmod
sshmt -h
Alıntı:
KULLANIM
sshmt [-v] ARGS [+[N] ARGS]... [-- COMMON]
sshmt -h
ÖZET
ssh
İlk argüman kümesi ARGS
ve ortak argümanlarla komutu çağırır COMMON
. Bu komutun çıkış durumunu döndürür 255
ve ikinci argüman kümesi ARGS
varsa, ikincisi ssh
bunlarla çağrılır ARGS
ve COMMON
; sonra üçüncü ve benzeri.
Örnek durumunuzda böyle çağırmak istersiniz:
sshmt 10.0.0.1 + my_machine.example.com + my_machine.example.com -J me@other_machine.example.com
veya bazı uygun zaman aşımları ile daha iyi:
sshmt 10.0.0.1 +2 my_machine.example.com +3 my_machine.example.com -J me@other_machine.example.com +5
Uzaktan kolayca yürütmek için şunu df -h
çağırın:
sshmt 10.0.0.1 df -h +2 my_machine.example.com df -h +3 my_machine.example.com -J me@other_machine.example.com df -h +5
ama kendini tekrarlamak istemiyorsan, onun yerine bunu kullan:
sshmt 10.0.0.1 +2 my_machine.example.com +3 my_machine.example.com -J me@other_machine.example.com +5 -- df -h
Borular da çalışmalıdır:
echo 123 | sshmt 10.0.0.1 +2 my_machine.example.com +3 my_machine.example.com -J me@other_machine.example.com +5 -- sh -c "cat > /tmp/foo"
Uygulamada bir takma ad tanımlamak isteyebilirsiniz:
alias myssh='sshmt 10.0.0.1 +2 my_machine.example.com +3 my_machine.example.com -J me@other_machine.example.com +5 --'
sonra giriş yapın
myssh
veya benzeri bir komutu çalıştırmak
myssh uptime
Kod bu. Tüm mantığı komut satırını gerçekten ayrıştırıyor.
#!/usr/bin/env bash
executable=/usr/bin/ssh
exename="${executable##*/}"
myname="${0##*/}"
declare -a args
declare -a seq_opts
declare -a common_opts
main () {
split_opts "$@"
process_seq "${seq_opts[@]}" "+"
exit 255
}
split_opts () {
while [ $# -ne 0 ]; do
if [ "$1" = "--" ]; then
shift
common_opts=("$@")
break
else
seq_opts=("${seq_opts[@]}" "$1")
shift
fi
done
}
process_seq() {
if [ "$*" = "+" ] || [ "$1" = "-h" ]; then
print_help; exit 0
fi
while [ $# -ne 0 ]; do
if [ "${1:0:1}" != "+" ]; then
args=("${args[@]}" "$1")
else
timeout="${1:1}"
[[ "$timeout" =~ ^[0-9]*$ ]] || print_error
if [ "${#args[*]}" -ne 0 ]; then
printf '%s\n' "${myname}: trying ${args[*]}" >&2
"$executable" ${timeout:+-o ConnectTimeout=$timeout} "${args[@]}" "${common_opts[@]}"
status=$?
[ $status -ne 255 ] && exit $status
args=()
fi
fi
shift
done
}
print_error() {
cat >&2 << EOF
${myname}: error parsing command line
Try '$myname -h' for more information.
EOF
exit 254
}
print_help() {
cat << EOF
USAGE
$myname [-v] ARGS [+[N] ARGS]... [-- COMMON]
$myname -h
SYNOPSIS
Invokes \`${exename}' command with the first set of arguments ARGS
and common arguments COMMON. If this command returns
exit status of 255 and the second set of arguments ARGS
exists, then the second \`ssh' will be invoked with these
new ARGS and COMMON; then the third and so on.
Empty set of arguments is discarded without invoking \`ssh'.
Successful invocation of \`ssh' stops parsing the command
line and makes the script exit.
OPTIONS
-h print this help and exit (must be the first option)
+, +N execute \`ssh' with preceding ARGS and COMMON
N, if given, specifies timeout for \`ssh' invoked with
immediately preceding ARGS. This is just a convenient
alternative for \`-o ConnectTimeout=N'.
The final set of arguments may or may not have a terminating \`+'.
EXIT STATUS
The exit status is 254 in case of an error while parsing
the command line; 255, if none of \`${exename}' managed
to connect; or an exit status of successfully connected
\`${exename}' otherwise.
EXAMPLES
To try 10.0.0.1 and, if failed, the alternative address:
$myname 10.0.0.1 + my_machine.example.com
To execute \`df -h' with timeouts:
$myname 10.0.0.1 +3 my_machine.example.com +5 -- df -h
LICENCE
Creative Commons CC0.
EOF
}
main "$@"