Конфликты ControlMaster с ForwardAgent

Что такое ш

sh(или язык команд оболочки )— это язык программирования, описанный POSIX. стандарт . Имеет множество реализаций (ksh88, dash,... ). bashтакже может быть считается реализациейsh(см. ниже ).

Поскольку sh— это спецификация, а не реализация, /bin/sh— символическая ссылка. (или жесткая ссылка )на фактическую реализацию в большинстве систем POSIX.

Что такое баш

bashначинался какsh-совместимая реализация (, хотя она предшествовала стандарту POSIX на несколько лет ), но с течением времени она приобрела множество расширений. Многие из этих расширений могут изменить поведение допустимых сценариев оболочки POSIX, поэтому сам по себе bashне является допустимой оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.

bashподдерживает переключатель --posix, что делает его более совместимым с POSIX -. Он также пытается имитировать POSIX, если вызывается как sh.

ш = баш?

Долгое время /bin/shуказывал на /bin/bashв большинстве систем GNU/Linux. В результате стало почти безопасно игнорировать разницу между ними. Но это начало меняться в последнее время.

Некоторые популярные примеры систем, в которых /bin/shне указывает на/bin/bash(и на некоторых из которых /bin/bashможет даже не существовать ), являются:

  1. Современные системы Debian и Ubuntu, которые по умолчанию создают символическую ссылку shна dash;
  2. Busybox , который обычно запускается во время загрузки системы Linux как часть initramfs. Он использует реализацию оболочки ash.
  3. BSD и вообще любые системы, отличные от -Linux. OpenBSD использует pdksh, потомок оболочки Korn. FreeBSD shявляется потомком оригинальной оболочки UNIX Bourne. У Solaris есть собственный sh, который долгое время не был совместим с POSIX -; бесплатная реализация доступна в проекте Heirloom .

Как узнать, на что указывает /bin/shв вашей системе?

Сложность заключается в том, что /bin/shможет быть символической ссылкой или жесткой ссылкой. Если это символическая ссылка, переносимый способ ее разрешения:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Если это жесткая ссылка, попробуйте

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Фактически, флаг -Lраспространяется как на символические, так и на жесткие ссылки. но недостаток этого метода в том, что он не переносимый — POSIX не требуетfindдля поддержки опции -samefile, хотя и GNU find , и FreeBSD find поддерживают его.

Линия Шебанг

В конце концов, вам решать, какой из них использовать, написав строку «shebang».

.

#!/bin/sh

будет использоватьsh(и что бы это ни случилось, чтобы указать на ),

#!/bin/bash

будет использовать /bin/bash, если он доступен (, и выдаст сообщение об ошибке, если он не ). Конечно, вы также можете указать другую реализацию, например.

#!/bin/dash

Какой использовать

Для собственных сценариев я предпочитаю shпо следующим причинам:

  • стандартизирован
  • он намного проще и легче в освоении
  • он переносим между системами POSIX — даже если у них нет bash, они должны иметьsh

Использование bashтакже имеет свои преимущества. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные с областью действия и массивы. Plain sh— очень минималистичный язык программирования.

2
08.10.2019, 17:04
1 ответ

Переадресация агента совместима с общим доступом к соединению. Они взаимодействуют друг с другом в том смысле, что переадресация агента происходит только в главном соединении. Ведомое соединение не выполняет переадресацию агента, потому что нет смысла снова пересылать агента, если мастер уже сделал это. Вы получите одинаковое значение SSH_AUTH_SOCKво всех соединениях, выполненных через одно и то же основное соединение.

Здесь, должно быть, произошло то, что вы включили совместное использование соединения, а затем запустили главное соединение без переадресации агента, либо потому, что у вас была отключена переадресация агента в то время, либо потому, что вы запустили основное соединение из контекста, в котором SSH_AUTH_SOCKне устанавливается на клиенте. Затем вы создали подчиненное соединение, прикрепленное к этому главному соединению.

Закройте главное соединение и запустите новое, убедившись, что оно работает в контексте, где у него есть доступ к агенту (, например. не задание cron, где SSH_AUTH_SOCKне определено ).

1
28.04.2021, 23:28

Теги

Похожие вопросы