Системные команды с помощью Python (os.system())

Практически для каждого администратора Linux командная строка становится основным инструментом для работы вместо любого графического интерфейса.

Список ключей для команды ls.

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

  • -l — вывод подробной информации о содержимом каталога в виде списка;
  • -a (—all) — вывод информации о всех имеющихся объектах явных и скрытых;
  • -A (—allmost-all) — вывод информации о всех имеющихся явных и скрытых объектах (за исключением объектов «.» и «..»);
  • -d (—directory) — вывод информации о директории без вывода его содержимого;
  • -F — к объектам являющимся каталогами добавит в конце символ слеш «/», к объектам являющимися исполняемыми файлами добавляется «*», к объектам являющимися символьными ссылками — «@»;
  • -r (—reverse) — данные ключи меняют сортировку на обратную;
  • -i — отображение номера индексных дескрипторов объектов;
  • -S — сортировка объектов по размеру от большого к меньшему;
  • -Sr — сортировка объектов по размеру от меньшего;
  • -t — сортировка объектов по времени модификации файлов;
  • -R (—recursive) — вывод информации об имеющихся объектах в том числе и объектах во вложенных каталогах.

Способы работы с командой ls и ее ключи, упоминаемые в статье это далеко не весь список. Если вы желаете использовать всю мощь этой на первый взгляд простой команды, то как уже упоминалось ранее, более подробную информацию можно получить при вызове встроенного мануала $ man ls .

Читайте также:  iOS 11.2.5 бета 6 выпущена для разработчиков от Apple

Использование метода ()

Как указывалось ранее, выполнение команд оболочки в Python можно легко выполнить с помощью некоторых методов модуля os . Здесь мы собираемся использовать широко используемый () .

Эта функция реализована с использованием функции C system() и, следовательно, имеет те же ограничения.

Метод принимает системную команду как строку на входе и возвращает код вывода.

В приведенном ниже примере мы пытаемся проверить версию Python в нашей системе с помощью командной строки.

import os command = «python —version» #command to be executed res = (command) #the method returns the exit status print(«Returned Value: «, res)

Выход:

Python 3.7.4 Returned Value: 0

Здесь res сохраняет возвращенное значение (код выхода = 0 для успеха). Из выходных данных видно, что команда выполнена успешно, и мы получили нашу версию Python, как и ожидалось.

Вводная информация

Для начала давайте создадим пользователей над которым будем ставить эксперименты (подробно про создание пользователей можно почитать тут – Пользователи в Linux — добавление, изменение, удаление):

useradd hc -m -G wheel passwd hc

12 useradd hcmGwheelpasswd hc

Сразу поместим нашего пользователя hc в группу wheel. Традиционно, в эту группу помещаются пользователи, которые будут иметь административный доступ. Это повелось еще с тех пор, когда основным инструментом для делегирования прав была команда su. Если интересуют подробности – поищите сами.

useradd user1 -m passwd user1

12 useradd user1mpasswd user1

Второй пользователь нужен нам для разнообразия.

Файл конфигурации /etc/sudoers и visudo

Все настройки хранятся в файле /etc/sudoers. Файл этот не совсем обычный, даже под рутом просто так его отредактировать не получиться, т.к. запись в файл запрещена. Для работы с этим файлом есть специальная утилита visudo. Смысл такого ограничения вот в чем. Любая ошибка делает sudo неработоспособным, стоит ошибиться или описаться и получаете кучу проблем. Вы можете совсем лишиться доступа к административным функциям и придется пользоваться recovery mode для восстановления доступа. Это если у вас есть физический доступ к серверу. А если это VPS?

Читайте также:  Как создать нового пользователя sudo на сервере Ubuntu Linux

Что бы такое не происходило visudo при запуске блокирует файл sudoers и для редактирования открывает копию. При сохранении происходит проверка синтаксиса и если допущена ошибка – выдаст об этом предупреждение.

visudo: >>> /etc/sudoers: syntax error near line 28 <<< What now?

12 visudo:>>>/etc/sudoers:syntax error near line28<<<What now?

В ответ введите:e – откроет снова файл для исправления ошибки;x – не сохранять изменения;Q – сохранит файл не смотря на ошибки (так лучше не делать);

ВАЖНО! В некоторых “инструкция” которые можно найти предлагают делать следующее – сначала root разрешает запись в файл sudoers, что то типа:

chmod +w /etc/sudoers

1 chmod+w/etc/sudoers

потом просто редактируем файл и снимаем запись chmod -w. Ни когда так не делайте! Чаше всего так советуют из нежелания пользоваться редактором vi, который запускается по умолчанию через visudo. Если вам не нравиться vi, его можно спокойно заменить на любой другой. Для этого в консоли выполните, например:

EDITOR=nano visudo

1 EDITOR=nano visudo

В этом случае запуститься редактор nano вместо vi.

Меняем редактор visudo

Если же хотите, назначить редактор на постоянную основу, переопределите значение EDITOR. Я обычно это делаю через пользовательский конфиг оболочки – для bash это ~/.bashrc. Добавьте в файл следующую строку:

export EDITOR=nano

1 export EDITOR=nano

Зайдите в сессию заново, выполните для проверки:

[[email protected] ~]# env | grep EDIT EDITOR=nano

12 [root@hc~]# env | grep EDITEDITOR=nano

Если не хотите менять системный редактор, а задать только для visudo, добавьте в sudoers след. строки:

Читайте также:  Все в одном: как выбрать моноблок для офиса или дома

# Сбрасываем переменных окружения окружения Defaults env_reset # Устанавливаем nano редактором по умолчанию и запрещаем использовать EDITOR/VISUAL из окружения Defaults editor=/usr/bin/nano, !env_editor

1234 # Сбрасываем переменных окружения окруженияDefaults env_reset# Устанавливаем nano редактором по умолчанию и запрещаем использовать EDITOR/VISUAL из окруженияDefaults editor=/usr/bin/nano,!env_editor

Оператор OR (||)

Оператор OR (||) очень похож на оператор «else» в программировании. Вышеуказанный оператор позволяет вам выполнять вторую команду только в случае сбоя при выполнении первой команды, то есть состояние выхода первой команды равно «1» — программа выполнена НЕ успешно».

Например, я хочу выполнить «apt-get update» из учетной записи без полномочий root, и если первая команда не будет выполнена, тогда будет выполнена вторая команда «links ».

sudo apt update || links

В приведенной выше команде, поскольку пользователю не было разрешено обновить систему, это означает, что состояние выхода первой команды равно «1» и, следовательно, выполняется последняя команда «links ».

Что, если первая команда выполнена успешно, со статусом выхода ««? Очевидно! Вторая команда не будет выполнена.

mkdir test || links

Здесь пользователь создает папку «test» в своем домашнем каталоге, где ему это разрешено. Команда выполнена успешно, что дает статус выхода ««, и, следовательно, последняя часть команды не выполняется.