То, что Вы ищете, называют "ssh мультитранзитным участком". Довольно возможно сделать это прозрачно, с помощью директивы ProxyCommand в .ssh/config
(или эквивалентная опция конфигурации в PuTTY или what-have-you):
Host linux-server-b
ProxyCommand ssh -q linux-server-a nc -q0 linux-server-b 22
Что это делает, когда Вы пытаетесь соединиться с linux-server-b
:
linux-server-a
netcat
там, и открывает соединение TCP для linux-server-b
Таким образом, можно использовать все функции SSH, как будто Вы были подключены с linux-server-b
непосредственно; можно даже объединить несколько транзитных участков в цепочку вместе (сервер к серверу B к серверу C к серверу D...)
См. также:
Это для совместимости с Оболочкой Bourne. Оболочка Bourne была старой оболочкой, которая была сначала выпущена с версией 7 Unix в 1979 и была все еще распространена до середины 90-х как /bin/sh
на большинстве коммерческих Нельдов.
Это - предок большинства подобных Границе оболочек как ksh
, bash
или zsh
.
Это имело несколько неловких функций, многие из которых были зафиксированы в ksh
и другие оболочки и новая стандартная спецификация sh
, один из которых является этим:
С Оболочкой Bourne (по крайней мере, те варианты, где это не было зафиксировано): "$@"
расширяется до одного пустого аргумента, если список позиционных параметров пуст ($# == 0
) вместо никакого аргумента вообще.
${var+something}
расширяется до "чего-то" если $var
сброшен. Это ясно документируется во все оболочки, но трудно найти в bash
документация, поскольку необходимо обратить внимание на это предложение:
Если не выполнение расширения подстроки, использование форм зарегистрировали ниже, тесты удара для параметра, который сброшен или пустой указатель. Исключение двоеточия приводит к тесту только для параметра, который сброшен.
Так ${1+"$@"}
расширяется до "$@"
только если $1
установлен ($# > 0
) который работает вокруг того ограничения Оболочки Bourne.
Обратите внимание, что Оболочка Bourne является единственной оболочкой с той проблемой. Современный sh
s (который является sh
приспосабливание спецификации POSIX sh
(который Оболочка Bourne не)), не имеют той проблемы. Таким образом, Вам только нужно это при необходимости в коде для работы над очень старыми системами где /bin/sh
могла бы быть Оболочка Bourne вместо стандартной оболочки (обратите внимание, что POSIX не указывает местоположение стандарта sh
, так, например, на Солярисе перед Солярисом 11, /bin/sh
была все еще Оболочка Bourne (хотя не имел того конкретного вопроса), в то время как нормальное/стандартное sh
был в другом месте (/usr/xpg4/bin/sh
)).
Существует проблема в этом perlrun
страница perldoc в этом $0
не заключается в кавычки все же.
См. http://www.in-ulm.de/~mascheck/various/bourne_args/ для получения дополнительной информации.
Существует различие между:
command ""
и
command
В одном Вы передаете один аргумент, который является пустой строкой. Во втором существуют нулевые переданные аргументы.
Для обоих, "$" приравняется к тому же самому: ""
. Но использование ${1:+"$@"}
был бы ""
поскольку первое и никакие аргументы передали для второго, которое было намерением.
Это становится важным при выполнении чего-то сценарий ниже, названный sshwrapper, который Вы называете с дополнительной командой или никакими аргументами для получения интерактивной оболочки.
: sshwrapper [command]
exec /usr/bin/ssh "${HOSTNAME:-localhost}" "$@"
Это попыталось бы работать "" на удаленном хосте (который просто возвращается), это не была бы интерактивная оболочка.
: sshwrapper [command]
exec /usr/bin/ssh "${HOSTNAME:-localhost}" ${1:+"$@"}
Запустил бы интерактивную оболочку на удаленном хосте, потому что должностное лицо правильно интерпретирует переменную как ничто, не пустую строку.
Считайте на использовании "$ {параметр: + слово}" ("Используют Альтернативное Значение"), и подобные переменные строки расширения в страницах руководства удара.
sh
реализация (см. другой ответ).
– törzsmókus
07.01.2015, 10:08
${1:+"$@"}
не расширился бы ни до какого аргумента если $1
было пусто. Вы хотите ${1+"$@"}
. В основном у Вас есть инвертированный.
– Stéphane Chazelas
07.01.2015, 11:40
Я подвел ответ Стефана Чазелас:
, так что если использовать второй с параметром «», это означает, что 1 доллар - это нулевой, но он не проверяет, является ли это значением null или нет, он просто видит, что он уже уволен, тем не менее Таким образом, он расширит $ @, но вы используете $ {1: + «$ @»} 'с "", он больше не будет расширяться $ @
.