SSH-подключение к системе с ZSH в качестве оболочки по умолчанию не запускается /etc/profile

Оп здесь. Возможное решение взлома может быть похоже на

inotifywait -m "$dir" -e moved_to --timefmt='%s' --format '%T' | stdbuf -oL uniq |...

РЕДАКТИРОВАТЬ:См. мой другой ответ на этот вопрос, так как второй вариант ИМХО лучше

Это работает за счет того, что время, прошедшее с начала эпохи, печатается при каждом выполнении move_to, что является последним этапом одиночной -передачи файла.

Это работает прилично, даже если процедура загрузки поста -может запускаться несколько раз, если одна загрузка длится более одной секунды.

Другую степень детализации можно получить, изменив флаг --timefmtна другое значение.

Опубликовать это здесь как полу -достойную идею, хотя мне это не очень нравится... тем не менее, я подумал о том, чтобы поделиться ею.

5
30.08.2019, 00:52
2 ответа

ZSH просто работает таким образом./etc/profileНЕ является файлом инициализации для ZSH . ZSH использует /etc/zprofileи ~/.zprofile.

Файлы инициализации для ZSH:

  1. /etc/zshenv
  2. ~/.zshenv
  3. режим входа :
    1. /etc/zprofile
    2. ~/.zprofile
  4. интерактивный :
    1. /etc/zshrc
    2. ~/.zshrc
  5. режим входа :
    1. /etc/zlogin
    2. ~/.zlogin

enter image description here

Советы:

  • Оболочка по умолчанию, открытая в вашем терминале в Linux, представляет собой интерактивную оболочку без входа -. Но в macOS это оболочка входа.

Ссылки

4
27.01.2020, 20:39

sshd запускает оболочку входа в систему, когда клиент не отправляет команду для запуска. Это должно имитировать поведение rsh, которое вызывало службу rlogindвместо службы rshd, когда не было задано никакой команды для запуска.

Чтобы сообщить оболочке, что это должна быть оболочка входа в систему, например rlogind, loginили telnetd, sshdзапускает вашу оболочку с argv[0], которая начинается с -.

Или, конечно, zshкак и любая другая оболочка, понимает это. В противном случае его нельзя было бы вызвать в режиме входа в систему .

Здесь симптом, заставивший вас думать, что вы не получили оболочку входа в систему, заключался в том, что /etc/profileне был интерпретирован.

/etc/profile— это файл инициализации сеанса входа в систему для Bourne -, например для оболочек. Ожидается, что синтаксис там будет в синтаксисе оболочки Bourne (или, возможно, синтаксисе POSIX sh, поскольку оболочка Bourne почти никогда не используется в наши дни )и читается при входе в систему всеми оболочками, чей синтаксис (в основном )обратно совместим с синтаксисом Bourne или POSIX sh.

cshи tcsh, которые имеют совершенно другой синтаксис, вместо этого используют /etc/csh.login. fishиспользует/etc/fish/config.fish(независимо от того, находится ли он в режиме входа в систему или нет ).

Синтаксис

zshтакже не полностью совместим с синтаксисом Bourne/POSIX, поэтому по умолчанию он не читается /etc/profile. Его файлы конфигурации в режиме входа в систему имеют вид/etc/zsh/zprofile(или /etc/zprofileв зависимости от того, как zshбыл настроен во время сборки )и/etc/zsh/zlogin(или /etc/zlogin), последний из которых получен после zshrc.

zshисходит только из /etc/profileв режиме эмуляции shили ksh, и в этом случае его синтаксис намного ближе к синтаксису POSIX sh, чем в режиме эмуляции zshпо умолчанию.

Если вы хотите, чтобы zshбыл источником /etc/profileв режиме входа в систему, вам нужно добавить source /etc/profileв /etc/zsh/zprofile, но вы хотите сделать это только после того, как убедитесь, что синтаксис /etc/profileи любой другой файл, из которого он исходит, совместим с файлом zsh.

В качестве альтернативы,можно добавить:

emulate sh -c 'source /etc/profile'

- /etc/zsh/zprofile. Тогда /etc/profileбудет использоваться в shрежиме эмуляции (, а функции, объявленные в нем, также сохранят shрежим эмуляции ).

5
27.01.2020, 20:39

Теги

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