"ошибка построения прокси..." при попытке запустить gnome-terminal от имени root

Утилита rename на основе perl может использовать любые операторы perl для переименования файлов, а не только поиск s /// оператор -and-replace или оператор перевода y // (просто убедитесь, что вы установили для $ _ то, что вы хотите, чтобы файл был переименован).

Из man rename :

«переименовать» переименовывает имена файлов, указанные в соответствии с правилом, указанным в качестве первого аргумента. Аргумент perlexpr - это выражение Perl, которое, как ожидается, изменит строку $ _ в Perl по крайней мере для некоторых из указанных имен файлов. Если данное имя файла не изменено выражением, оно не будет переименовано. Если в командной строке не указаны имена файлов, имена файлов будут считываться через стандартный ввод.

Например:

rename 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' files

Это разбивает имена файлов на базовое имя ($ b) и расширение ($ e). Затем в $ b все точки (. ) заменяются символами подчеркивания. Наконец, $ _ устанавливается в «$ b. $ E» .

Вывод (с подробным параметром -v ):

$ touch top_axi_256_wrapper_05.02.01.14.00_sample06.tgz \
    top_axi_128_wrapper_05.02.01.14.00_sample06.tgz \
    a72_a_0.0.0_0.00.04_ac_dc.tgz

$ rename -v 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' *
a72_a_0.0.0_0.00.04_ac_dc.tgz renamed as a72_a_0_0_0_0_00_04_ac_dc.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_128_wrapper_05_02_01_14_00_sample06.tgz
top_axi_256_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_256_wrapper_05_02_01_14_00_sample06.tgz

Кстати, используйте -n при тестировании операторов переименовать . Еще от man rename :

-n, -nono

Никаких действий: печатать имена файлов, которые нужно переименовать, но не переименовывать.

perl rename доступен в пакете для большинства дистрибутивов (например, пакет rename в Debian) или из https://metacpan.org/release/File-Rename

3
15.02.2017, 11:46
1 ответ

Помните, как Windows-приложения в основном работали еще во времена Win16, до того, как Win32 пришла и покончила с этим :там, где были hInstanceи hPrevInstance, попытка запуска второго экземпляра многих приложений просто сдала вещи. к первому экземпляру, и это усложняло работу инструментов командных сценариев (, таких как Take Command ), потому что при вызове приложения во второй раз оно было бы заметно на экране как добавленное окно, но насколько интерпретатор команд был обеспокоен тем, что дочерний процесс, который он только что запустил, немедленно завершился?

Итак, GNOME вернул поведение Win16 для Linux.

GNOME Terminal теперь является клиентским -серверным приложением. Программа gnome-terminal— это просто клиент, который формирует сообщения Desktop Bus на сервер, передавая параметры командной строки, среду, рабочий каталог и аргументы, а затем просто завершая работу. Это сервер gnome-terminal-server, который регистрируется как org.gnome.Terminalна шине рабочего стола и отвечает за всю фактическую эмуляцию терминала и отображение окна (с )в графическом интерфейсе (с ).

Клиент Desktop Bus, такой как gnome-terminal, находит посредника Desktop Bus через переменную среды, которая обычно указывает на сокет в пользовательском каталоге -, таком как /run/user/1001. В качестве альтернативы переменная среды указывает, что нужно искать в «каталоге среды выполнения текущего пользователя», и путь, аналогичный вышеупомянутому, создается из эффективного идентификатора пользователя клиентского процесса. Этот каталог в любом случае обычно является частным для отдельного пользователя и недоступен для других (непривилегированных )пользователей.

Веселье возникает, когда люди пытаются запустить gnome-terminalот имени другого пользователя через sudoи тому подобное. Если переменная среды указывает на каталог среды выполнения с явным именем -, непривилегированный клиент не может подключиться к шине рабочего стола пользователя -для каждого пользователя.Если переменная среды указывает на каталог среды выполнения «текущего пользователя», она ищет неверный посредник шины рабочего стола, часто тот, который принадлежит пользователю, у которого в настоящее время не запущен посредник шины рабочего стола, потому что пользователь не вошел в систему и запустил эту учетную запись пользователя для -пользовательских служб. (Брокеры Desktop Bus для -пользователей запускаются диспетчером служб для -пользователей. Диспетчер пользовательских служб -либо запускается явно, либо, в случае некоторых программ управления службами, с помощью некоторых довольно уродливых хуков в процессе аутентификации пользователя, используемых подобными серверами login, suи SSH. программы.)

Причина того, что dbus-launchсработало для вас как суперпользователя, заключается в том, что dbus-launchявным образом запустил другого посредника Desktop Bus, работающего от имени суперпользователя, с которым gnome-terminalмог общаться. К счастью, система также была настроена на требование -запуска сервера gnome-terminal-server, когда клиент пытался подключиться к нему через брокера. (Это не обязательно так, и в настоящее время такой запуск по запросу -рассматривается как второстепенный механизм, поскольку он приводит к большому количеству серверных процессов шины рабочего стола, которые не выполняются ни под каким видом управления службами. Действительно, отсутствие самого брокера под управлением сервиса также считается недостатком. Также обычно не считается хорошей идеей для учетной записи суперпользователя запускать такого рода службы, поскольку многие из них не ожидают, что будут работать с привилегиями суперпользователя, потому что они ожидают, что будут работать под эгидой обычных учетные записи пользователей.)

Дальнейшее веселье возникает, если, как вопрошавший в «Как я могу запустить терминал gnome -удаленно на моем безголовом сервере? (не удается запустить через пересылку X11)», люди пытаются запустить gnome-terminal, когда даже у исходного пользователя не запущен брокер шины рабочего стола. Это происходит, когда, например,один из них вошел в систему через SSH, но процесс входа в систему SSH не запускает диспетчер служб -для каждого пользователя, что, в свою очередь, означает, что брокер шины рабочего стола для -пользователя не запущен, а сервер gnome-terminal-serverне может быть запущен. достигнуто через шину рабочего стола. (В зависимости от того, как настроена система, графический вход в систему может запускать -диспетчер служб для каждого пользователя, и, следовательно, можно наблюдать, что графический вход в систему, поскольку тот же пользователь волшебным образом заставляет все работать. И снова dbus-launchбудет явно запускать не -службу -управляемого брокера Desktop Bus.)

Еще больше веселья возникает, когда у одного из менеджеров служб есть перехватчики login, suи SSH-сервера. Эти перехватчики обычно реализуют семантику запуска для -пользовательского управления службами и всеми -пользовательскими службами, которые он запускает, при первом входе в систему -для этого пользователя; и остановить их всех, наконец, -выйти из системы для этого пользователя. Если у вас много короткоживущих -и неперекрывающихся -сеансов SSH, то может возникнуть много накладных расходов, бесполезно запускаемых и закрывающих всю систему управления сервисами для -пользователей (и все его службы автоматического -запуска )в начале и в конце каждой из этих сессий SSH. systemd, один из таких сервис-менеджеров, имеет несовершенный механизм «задержки», который на самом деле только наполовину решает эту проблему. Это означает, что управление службой для каждого -пользователя «задерживается» после окончательного -отключения, но это не мешает запуску управления службой для каждого -пользователя вообще.

Дополнительная литература

9
27.01.2020, 21:11

Теги

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