Как правильно редактировать системные файлы (как root) в графическом интерфейсе (и CLI) в Gnu / Linux?

Это команды, написанные новичком, который либо ничего не узнал с начала 90-х, либо следует HOWTO той эпохи. Было бы лучше записать так:

num_rec=$(wc -l 

Здесь используется подстановка команд для получения счетчика строк из test.cv с использованием wc -l (путем перенаправления, чтобы wc не выводит имя файла вместе со счетчиком строк).

Затем он снова использует подстановку команд, на этот раз с printf и строкой формата для обнуления счетчика строк так, чтобы он имел фиксированную ширину 6 цифр, с арифметикой оболочки для добавления 2 к $ num_rec .

$ 1 в исходной команде awk ссылается на первое поле ввода (в данном случае счетчик строк из wc )

{ {1}}

4
18.03.2020, 12:41
3 ответа

Вы не должны запускать редактор от имени пользователя root без крайней необходимости; вам следует использовать sudoedit или административные функции среды рабочего стола.

sudoedit

После того, как sudoedit настроен должным образом, вы можете сделать

SUDO_EDITOR="/opt/sublime_text/sublime_text -w" sudoedit yourfile

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

Я бы предложил функцию, а не псевдоним:

function susubl {
    export SUDO_EDITOR="/opt/sublime_text/sublime_text -w"
    sudoedit "$@"
}

хотя, как указал Джефф Шаллер , вы можете использовать env , чтобы поместить это в псевдоним и избежать изменения вашего среда оболочки:

alias susubl='env SUDO_EDITOR="/opt/sublime_text/sublime_text -w" sudoedit'

Параметр -w гарантирует, что вызов Sublime Text ждет, пока файлы не будут закрыты, прежде чем вернуться и позволить sudoedit скопировать файлы обратно.

Среды рабочего стола (GNOME)

В GNOME (и, возможно, других средах рабочего стола) вы можете использовать любой редактор с поддержкой GIO / GVFS с префиксом admin: // ; например

gedit admin:///path/to/your/file

Это запросит соответствующую аутентификацию с помощью PolKit, а затем откроет файл для редактирования, если аутентификация прошла успешно.

10
20.08.2021, 11:42

Это расширение ответа Стивена Китта , подходящее для тех, кто ищет готовое -–-решение для использования.


Предлагаемое POSIX-написанное решение для наиболее часто используемых редакторов

Вам, конечно, следует составить свой собственный список избранных редакторов, это всего лишь пример, заполнить список выбранными вами редакторами.

### Generic function text editing as root. ###
# The proper = safe way through sudoedit.
# Various things are taken into account like aliases or a specific Code case.
sudoedit_run ()
{

    # check the minimum number of arguments
    if [ $# -lt 3 ]; then
        printf '%b\n' "sudoedit_run(): Low number of arguments.\\nExpected: \$1 = editor name; \$2 = wait option; \$3, (\$4),... = file(s).\\nPassed $#: $*" >&2
        return 1
    fi

    # let's take a closer look at the first argument, the editor
    editor_name=$1

    # store an editor alias, if there is any
    editor_alias=$( alias "${editor_name}" 2> /dev/null )

    # remove that alias for now
    if [ -n "${editor_alias}" ]; then unalias "${editor_name}"; fi

    # store the first 2 arguments to variables
    editor_path=$( command -v "${editor_name}" ); wait_option=$2

    # check if that editor exists on this system
    if ! [ -x "${editor_path}" ]; then
        printf '%b\n' "sudoedit_run(): The editor ('${editor_name}') path ('${editor_path}') does not exist on this system." >&2
        return 1
    fi

    # let's move past the editor and its wait option to the actual files
    shift 2

    # env - use it or not? + why?
    SUDO_EDITOR="${editor_path} ${wait_option}" sudoedit "$@"

    # re-define the editor alias, if there was any
    if [ -n "${editor_alias}" ]; then eval "${editor_alias}"; fi

}

#--------------------------------------------------------------------

### editor aliases generators / definitions ###

## CLI editors
# shellcheck disable=SC2139
for cli_editor in vi nano; do
    alias su${cli_editor}="sudoedit_run ${cli_editor} ''"
done

## GUI editors
# shellcheck disable=SC2139
for gui_editor in subl xed gedit; do
    alias su${gui_editor}="sudoedit_run ${gui_editor} -w"
done
# vscode-specific workaround under root
alias sucode="sudo code -w --user-data-dir=/root/.vscode"

#--------------------------------------------------------------------

### other aliases definitions ###

# we can use aliases for editors with the above code, for example
alias code='code --reuse-window'

Это решение вы можете поместить, например, непосредственно в свой .bash_aliasesфайл.


Исследуйте -если скучно, переходите к предложенному мной решению!

  1. Узнайте, по какому пути находится ваш редактор, например.:

    $ which nano
    /usr/local/bin/nano
    

    Как видите, я использую скомпилированную nano, а не упакованную версию; независимо от того, это может измениться с system/config на другой system/config.

  2. Текстовые редакторы CLI , такие как viили nano, не нуждаются в опции ожидания , viиспользует механизм блокировки, а nanoнет, поэтому для скомпилированных nanoи предварительно -установленных viможно было бы написать такие функции:

    sunano () { env SUDO_EDITOR='/usr/local/bin/nano' sudoedit "$@"; }
    suvi ()   { env SUDO_EDITOR='/usr/bin/vi' sudoedit "$@"; }
    
  3. Текстовые редакторы GUI , напротив, такие как встроенный в Linux Mint xed, бесплатные программы, такие как Visual Studio Code (code), или платные программы, такие как Sublime Text(subl)у всех есть опция ожидание , и вам нужно использовать ее, чтобы избежать проблемы, описанной в моем вопросе, вы можете использовать что-то похожее на эти функции:

    susubl () { env SUDO_EDITOR='/opt/sublime_text/sublime_text -w' sudoedit "$@"; }
    suxed ()  { env SUDO_EDITOR='/usr/bin/xed -w' sudoedit "$@"; }
    

Параметр-w(--wait)графического интерфейса редактора

Параметр-w(--wait)фактически делает то, что редактор будет ожидать на терминале, пока вы не закроете его, таким образом, ожидая закрытия редактора, позволяя планировать и выполнять дальнейшие действия при закрытии редактора, в данном случае чтобы сохранить изменения sudoedit. Обычно он просто освобождал терминал, и вы получали новое приглашение.

Представьте другое полезное использование для этого,самостоятельный -объяснительный:

code -w ~/.bash_aliases;. ~/.bash_aliases

Надеюсь, на этом примере я понятнее.

0
20.08.2021, 11:42

Другое решение :Я никогда не редактирую системные файлы напрямую, я делаю копию где-нибудь (*), редактирую копию (с помощью моего обычного редактора )и sudo cp, когда закончу.

(*)Для этого у меня есть директория, где все файлы хранятся в одном месте:

  • естественно сохраняет список всех файлов, которые я изменил
  • легкая версия
  • простое резервное копирование
  • легко перенести на другую машину
0
20.08.2021, 11:42

Теги

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