4

Я настраиваю Bastion Host

Jump Server

Я пытаюсь автоматически записывать SSH-терминалы на сервере, использую TermRecord . Проблема начинается, когда я добавляю TermRecord -o ss.html в мой .bashrc:

echo "TermRecord -o ss.html" >> ~/.bashrc

Терминал зальет "скрипт запущен", ничего не сохраняя.

2 ответа2

2

У меня нет абсолютно никакого опыта работы с TermRecord , мой ответ основан на разумном (я надеюсь, что так) предположении о том, что происходит.

Похоже, что TermRecord снова получает исходники .bashrc , или, скорее всего, он запускает другой bash который получает файл. Я предполагаю последнее. В любом случае, он снова запускает TermRecord , еще один bash снова получает исходники .bashrc и так далее.

Если это мешает вам войти в систему , см. Вход в систему без запуска bash_profile или bashrc. Я бы попробовал ssh -t username@hostname /bin/sh и исправил бы мой .bashrc оттуда.

Чтобы заставить его работать так, как вы ожидали, вам нужно найти способ подавить выполнение TermRecord если он уже находится внутри TermRecord . Лучше всего было бы, если бы программа добавила некоторую переменную в среду, чтобы вы могли ее обнаружить. Я не могу найти, устанавливает ли он какую-либо переменную.

Если это не так, вы можете сделать это самостоятельно. Вместо

TermRecord -o ss.html

в вашем .bashrc используйте что-то вроде этого:

[ -z "$TR_PPID" ] && { export TR_PPID=$$; TermRecord -o ss.html; }

Это означает: если переменная пуста, установите для нее PID оболочки и запустите TermRecord ; в противном случае ничего не делать (перейти к следующей строке).

Заметки:

  • Убедитесь, что переменная с именем TR_PPID не используется TermRecord или чем-либо еще. Я придумал это имя (из "PID TermRecord parend"), хотя может быть и столкновение.
  • -o ss.html может вызвать проблемы, если вы входите в систему несколько раз.
  • Если TermRecord будет выполнен, остальная часть .bashrc будет получена из внешнего bash как только TermRecord . Внутренний bash будет источником файла самостоятельно.
  • Чтобы избежать вложенных процессов, вы можете рассмотреть возможность замены внешнего bash на TermRecord вместо создания отдельного процесса; это можно сделать с помощью exec TermRecord -o ss.html . В этом случае вы, вероятно, захотите, чтобы вся строка была в самом начале вашего .bashrc . Теперь переменная будет означать "TermRecord PID", поэтому TR_PID будет лучшим именем.

Возможный(?) альтернатива: используйте TermRecord качестве оболочки для входа.

  • Только если он поддерживает оболочку входа в систему (я не знаю этого); в противном случае это может вызвать проблемы (но, возможно, пользовательская обертка исправит это). Эксперименты с изменением вашей оболочки входа в систему (см. chsh) должны выполняться, не покидая старой оболочки или даже с дополнительной "аварийной оболочкой". Если вы каким-либо образом блокируете себя и не можете войти заново, у вас все еще работает старая оболочка, и вы можете это исправить.
  • Это может потребовать редактирования /etc/shells .
  • В этом случае вы не должны запускать TermRecord из вашего .bashrc вообще.
0

Насколько я понимаю, вы хотите записать все ваши терминалы stdin/stdout, пока ssh'd на сервер?

рассмотреть возможность использования команды сценария

script <output_filename>

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

exit

чтобы остановить запись сценария, указанный вами $ output_filename будет находиться в вашем текущем каталоге.

PS: вы можете убедиться, что ваши записи всегда имеют уникальные имена, используя следующее соглашение

script foo_$(date  +"%Y-%m-%d%H%M")   # full date and time included in filename

или же

script foo_$(date +%s)  # unique number calculate by seconds since the Unix epoch

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .