У меня есть домашний компьютер (давайте назовем его франклином, потому что это - то, что я называю им), что я часто ssh в от моего ноутбука работы. Когда я дома, я ssh к franklin.local, и когда я работаю или где-либо еще, я ssh к remote.address.of.franklin.
Я хочу иметь функцию в своем профиле, который всегда соединяется корректным способом к ситуации. Мое состояние сети часто изменяется (соединенный проводом по сравнению с беспроводной связью, другим SSIDs, и т.д.), таким образом, я предпочел бы не делать это путем обнаружения состояния сети, а скорее:
Вот то, что я использую теперь:
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 одновременно и затем автоматически использовать, какой бы ни каждый соединяется сначала?
Что относительно того, чтобы пробовать простое OR
от Вашей оболочки?
ssh username@franklin.local || ssh -p 22 remote.address.of.franklin
Я не действительно знаком с ZSH, но я предполагаю, что логика оценки все еще была бы ленива, означая, что вторая часть только оценена, если первая часть перестала работать. Конечно, первая команда может остановить в течение некоторого времени попытку выяснить если franklin.local
доступно.
Вы могли присвоить ту команду псевдониму для сокращения, это (как Вы сделал с функцией).
Я использую 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
Оказывается, что я был ближе к решению, чем я думал. У меня было дефектное предположение о том, как часть поиска адреса 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 непосредственно.
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