Как отключить root и запустить скрипт Python, который изменяет весь диск с помощью SSH?

В качестве простого обходного пути вы можете запустить оболочку в вашей текущей оболочке и исходный код оттуда. Что-то вроде:

  1. Откройте новый терминал и настройте все так, как вы хотите. Вы упомянули некоторые переменные среды и тому подобное. Установите их здесь.

  2. В этом терминале запустите новую оболочку. Например, bash.

  3. Делай свое дело. Источник вашего сценария. Если он выходит, вы просто попадаете в первую оболочку, и все по-прежнему настроено. Просто запустите bashеще раз, и вы снова в деле.

Для иллюстрации я создал этот скрипт, который не работает, если вы попытаетесь получить его:

$ cat /home/terdon/scripts/bar.sh
set -o errexit
var='bar

Давайте посмотрим, что произойдет, если я запущу сеанс вложенной оболочки, а затем отправлю его (обратите внимание, что я использую переносимое имя для команды source, .; sourceэто башизм):

parent-shell $ bash      ## start a new shell
child-shell $. ~/scripts/bar.sh
bash: /home/terdon/scripts/bar.sh: line 2: unexpected EOF while looking for matching `''
parent-shell $ 

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

2
11.10.2019, 09:58
2 ответа

Вы не можете сделать именно так, как описано.

Однако многие дистрибутивы используют образ intramfs для очень ранней загрузки. Если бы вы изменили сценарии инициализации в этом образе, вы могли бы запустить свою задачу до того, как файловые системы будут смонтированы. Вам нужно быть очень умным, чтобы закодировать способ, чтобы это произошло только один раз. Все это можно было бы сделать удаленно с достаточным доступом. Поскольку CentOS и Debian используют разные системы для своих initramfs, вам нужно будет сделать это дважды. Было бы очень хорошей идеей устранить ошибки в одной системе, к которой у вас есть локальный доступ, прежде чем развертывать ее в системах, которых у вас нет. Такие вещи должны работать идеально.

1
27.01.2020, 22:08

Вы можете создать собственный образ initramfs для этой цели, просмотреть модули Dracut (или инструменты initramfs -, в зависимости от того, какой сборщик initramfs вы предпочитаете )для этого. Предоставление полной среды Python будет сложной задачей, я бы порекомендовал придерживаться инструментов оболочки, таких как sfdisk, если это возможно, хотя даже ваши стандартные initramfs уже имеют все необходимое для записи полного образа диска. Самый простой способ выполнить это — kexec, но даже если ваш образ диска сжимается очень хорошо (, убедитесь, что все неиспользуемые области обнулены! )Образ initramfs, содержащий его, может быть слишком большим для загрузки в работающей системе. В этом случае вам придется возиться с конфигурацией загрузчика, чтобы изменения вступили в силу при следующей перезагрузке. Некоторые загрузчики предоставляют функцию «однократной загрузки»; в противном случае вам придется отменить изменение после перезаписи диска. По крайней мере, загрузчик Syslinux позволяет вам загружать несколько образов initramfs, которые объединяются при загрузке, так что вы можете проверить свой обычный образ на наличие файла замещающего образа и записать его, прежде чем он продолжит загрузку.

1
27.01.2020, 22:08

Теги

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