SSH к двум адресам, используйте тот, который соединяется сначала

У меня есть домашний компьютер (давайте назовем его франклином, потому что это - то, что я называю им), что я часто ssh в от моего ноутбука работы. Когда я дома, я ssh к franklin.local, и когда я работаю или где-либо еще, я ssh к remote.address.of.franklin.

Я хочу иметь функцию в своем профиле, который всегда соединяется корректным способом к ситуации. Мое состояние сети часто изменяется (соединенный проводом по сравнению с беспроводной связью, другим SSIDs, и т.д.), таким образом, я предпочел бы не делать это путем обнаружения состояния сети, а скорее:

  1. Если франклин доступен локально, соединитесь локально,
  2. еще, соединитесь удаленно

Вот то, что я использую теперь:

function franklin () {
    ping -c 5 "franklin.local" > /dev/null
    if [[ $? != 0 ]]
        then
        echo "franklin not available on local, so trying remote connection"
        ssh -p 22 remote.address.of.franklin
    else
        echo "franklin available on local network, so trying local connection"
        ssh username@franklin.local
    fi
}

Проблема, ping занимает время. Мой вопрос: я могу выполнить и команды ssh одновременно и затем автоматически использовать, какой бы ни каждый соединяется сначала?

5
19.12.2012, 17:50
3 ответа

Что относительно того, чтобы пробовать простое OR от Вашей оболочки?

ssh username@franklin.local || ssh -p 22 remote.address.of.franklin

Я не действительно знаком с ZSH, но я предполагаю, что логика оценки все еще была бы ленива, означая, что вторая часть только оценена, если первая часть перестала работать. Конечно, первая команда может остановить в течение некоторого времени попытку выяснить если franklin.local доступно.

Вы могли присвоить ту команду псевдониму для сокращения, это (как Вы сделал с функцией).

4
27.01.2020, 20:37
  • 1
    О, человек, это полностью работает. Намного более хороший, чем тот я отправил и собирался принять как ответ, пока я не видел это. –  Zev Eisenberg 19.12.2012, 18:50
  • 2
    я рад, что Вам нравится он (o: –  Axel Knauf 19.12.2012, 18:51
  • 3
    @Alan, который Вы имеете в виду, делает передачу в другом направлении? Несомненно, просто инвертируйте перенаправления и замену gzip gunzip: ssh root@PC1 'gunzip >/dev/sdb' <~/Desktop/ddbackup/image.gz ---------121 '-o ConnectTimeout=5 добавления--------104608----' к 'ssh username@franklin.local' ускорит вещи немного также. –  Stephen Paul Lesniewski 06.01.2013, 17:14

Я использую nc вместо ping:

franklin() {
    local host=franklin.local
    if nc -w1 $host 22 &>/dev/null; then
        echo "connecting locally"
    else
        echo "connecting remotely"
        host=remote.address.of.franklin
    fi
    ssh username@$host "$@"
}

Я добавил "$@" к вызову ssh. Это позволяет нам, Вы быстро выполняете удаленные команды как

franklin uptime
2
27.01.2020, 20:37

Оказывается, что я был ближе к решению, чем я думал. У меня было дефектное предположение о том, как часть поиска адреса ping работает. Я думал, что, если бы у меня были сетевое отклонение и franklin.local, не возвратил ping, затем он перестал бы работать и соединился бы удаленно вместо этого. Оказывается, если franklin.local находится в сети, ping -c 1 franklin.local возвраты 0, и в противном случае это возвращается 68, оба довольно сразу. Таким образом, единственное изменение является количеством ping от 5 до 1 (я также настроил порядок сценария заставить его иметь больше смысла):

function franklin
{
    ping -c 1 franklin.local &> /dev/null
    if [[ $? == 0 ]]; then
        echo "Connecting locally."
        ssh "username@franklin.local"
    else
        echo "Connecting remotely."
        ssh "remote.address.of.franklin"
    fi
}

Это значительно быстрее, чем, как у меня был он прежде, и не заметно медленнее, чем просто использование соответствующей команды ssh непосредственно.

1
27.01.2020, 20:37