Birkaç bağlantı parametresi çalıştıran SSH sarıcı


2

Birisi başarılı oluncaya kadar art arda birkaç IP adresine bağlanmayı deneyebilen bir SSH sarıcıyı (veya varsa SSH seçeneğini) arıyorum. Örneğin 10.0.0.1, o zaman my_machine.example.comve sonunda my_machine.example.com -J me@other_machine.example.com.

Bunu yapan herhangi bir araç var mı?

Yanıtlar:


2

Bu benim genel amacım sshsarı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:$PATHchmod

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 255ve ikinci argüman kümesi ARGS varsa, ikincisi sshbunlarla çağrılır ARGSve 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 "$@"

2

Bildiğim kadarıyla böyle bir özellik yok. Ancak bu kolayca komut dosyası olabilir:

#!/bin/bash

usage ()
{
    echo "usage:"
    echo "  $0 MYHOST"
    echo "or"
    echo "  $0 IP DNS PROXYJUMP"
}

if [[ $# -eq 1 ]]; then
    host="$1"

    ssh ${host}_ip && exit 0
    ssh ${host}_dns && exit 0
    ssh ${host}_proxyjump && exit 0
    exit 1
else if [[ $# -eq 3 ]]; then
    ip="$1"
    dns="$2"
    proxy="$3"

    ssh "$ip" && exit 0
    ssh "$dns" && exit 0
    ssh "$dns" -J "$proxy" && exit 0
    exit 1
else
    echo "Illegal number of argument"
    usage
    exit 1
fi

Aşağıdaki .ssh/configdosyayla:

Host MYHOST_ip
  Hostname 10.0.0.1

Host MYHOST_dns
  Hostname my_machine.example.com

Host MYHOST_proxyjump
  Hostname my_machine.example.com
  ProxyJump me@other_machine.example.com

Örneğin proxyjump yapılandırmasının kullanılması durumunda bağlantının uzun zaman alabileceğini unutmayın . Aslında, bağlantı 2 zaman aşımından sonra gerçekleşebilir.


0

Buna oldukça benzeyen bir şeyin ProxyCommandssh config'deki seçenek kullanılarak oldukça kolay bir şekilde yapılabileceği ortaya çıktı . Kullanım durumumda öncelikle 10.0.0.1’e bağlanma zorunluluğunu atladım ve bununla sonuçlandım:

Host my_machine.example.com
    ProxyCommand nc "%h" "%p" || ssh -W "%h:%p" me@other_machine.example.com

Bunu ana bağlantılarla ( ControlMaster, ControlPathve ControlPersist) birleştirerek , bu teknik ilk başta istediğim şeyin% 95'ini yapar ve tekrarlanan bağlantılarda çok hızlıdır (ilki atlamadan geçmesi gerekiyorsa her zaman biraz yavaş).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.