Почему не может я запускать приложения GUI от 'корня': “Никакой протокол не указан”?

Вот то, что происходит:

  • find находит каталог соответствия ./Test 02.
  • find выполняется rename команда на том каталоге.
  • rename переименовывает Test 02 кому: Test_02.
  • find попытки убывать в каталог Test 02. Но это больше не существует.

Самый легкий способ решить эту проблему состоит в том, чтобы сказать find работать наоборот: сначала ищите соответствия в каталоге, затем проверьте, соответствует ли сам каталог. Это что -depth опция делает.

Если Вы только добавляете -depth, Вы столкнетесь с другой проблемой, которая является этим когда find достигает Test 01/Test A, это вызывает rename 'y/\ /\_/' 'Test 01/Test A', который пытается переименовать тот каталог к Test_01/Test_A. Это перестанет работать, так как нет никакого названного каталога Test_01. Легкая фиксация должна использовать -execdir опция, которая вызывает rename в Test 01 каталог и передачи Test A как аргумент. Можно ускорить вещи путем передачи нескольких аргументов rename в одном пакете, при помощи + вместо ; завершаться -execdir команда.

find -depth -name '* *' -type d -execdir rename 'y/ /_/' {} +

С другой стороны, используйте эту короткую, но загадочную команду zsh:

autoload zmv
zmv -Qw '**/*(/D)' '$1${2// /_}'

zmv функция переименовывает файлы согласно шаблонам. Исходный шаблон **/*, который соответствует всем файлам (*) во всех подкаталогах рекурсивно (**/). Спецификаторы шарика (активированный -Q опция), указывают, что только каталоги подобраны (/) и тот точечные файлы включены (D). -w опция создает обратную ссылку для каждого подстановочного знака в исходном шаблоне. Замена запускается с $1 который определяет соответствие для первого подстановочного знака (для **, это включает финал /), и сопровождается ${2// /_}, который является $2 (что * подобранный) измененный для замены всех пробелов _. Добавьте -v опция видеть, что делает команда, Вы заметите, что она пересекает глубину сначала как find -depth.

41
09.03.2014, 09:31
8 ответов
[115757]Доступ к X-серверу требует двух вещей:

Переменная [116357]$DISPLAY[116358], указывающая на правильное отображение (обычно [116359]:0[116360])

Свойственная информация об аутентификации

Информация об аутентификации может быть явно указана через [116091]$XAUTHORITY[116092], а по умолчанию [116093]~/. В противном случае [116095]$DISPLAY[116096] и [116097]$XAUTHORITY[116098] будут установлены для вашего пользователя, [116099]sudo[116100] также установит их для новой оболочки, и все должно работать нормально.

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

В Debian [116101]$XAUTHORITY[116102] обычно не установлена явно. Просто добавьте

к вашему [116103].bashrc[116104] или явно скажите [116105]XAUTHORITY=~/.Xauthority sudo ...[116106] и все должно работать.

Вы также можете использовать [116107]xauth list[116108] для проверки наличия правильной аутентификационной информации.[115772].

40
27.01.2020, 19:35
[115741]Вы можете либо

указать дисплей для использования в командной строке, добавив [116081]-дисплей :0.0

или

Установить переменную окружения в скрипте входа root'а (один из .bashrc, .profile, .bash_profile ...). экспортировать DISPLAY=:0. 0

Вы можете проверить, установлено ли оно,

Чтобы открыть дисплей для всех пользователей со всех хостов, как ваш обычный пользователь, вы можете сделать это с помощью :

xhost +

rsync -avc -e ssh /path/to/files user@computer:/path/to/files

10
27.01.2020, 19:35

Я придумал:

find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done

что работает.

-121--205243-

С помощью awk :

awk '{if($0=="click"){getline n;printf "%s(%s)\n", $0, n}else{print}}' file

Если строка соответствует щелкните , загрузите следующую строку в переменную с именем n , а затем распечатайте требуемый формат вывода.

Edit:

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

awk '{if($0=="click"){getline n; printf "%s(%s", $0, n;
  while($0!=""){printf ",%s", $0; getline};
  printf ")\n\n", x}else{print}}' file

Она печатает строки, разделенные запятыми, пока не найдет пустую строку.

-121--133211-

У меня был тот же вопрос, что и у вас, но для обычного пользователя. Допустим, я хочу запустить firefox с помощью учетной записи пользователя foo. Я вошел в систему под именем bar:

[bar@localhost ~]$ sudo -u foo -H firefox

К сожалению, эта команда завершилась с той же ошибкой, что и в вопросе (т.е. ни один протокол не указан и не может открыть дисплей)

Моим решением было просто добавить пользователя foo в список авторизованного доступа к серверу X.

xhost si:localuser:foo

И тогда я смог запустить Firefox (и другое приложение X) с помощью sudo и пользователя foo.

Фон : В окне X имеется архитектура клиент/сервер. При запуске приложения запрашивается разрешение X-сервера на его отображение. По умолчанию, как только вы открываете сеанс (вы графически входите в систему), вам (вашему пользователю), очевидно, разрешено общаться с сервером и отображать приложения. Другие пользователи не имеют этого разрешения, если его не указать. xhost - это средство для управления списком разрешений. si указывает на то, что правило является серверным, и уполномочивает локального пользователя foo отображать приложения. X Window является очень мощным в этом отношении, и вы можете отображать удаленные приложения локально, играя с переменной среды DISPLAY и xhost (но не ограничиваясь ими). В более старые времена, когда люди набирали xhost + и неявно позволяли всем использовать свою X-сессию, можно было отображать приложение на своем экране для приколов; -) не столько сейчас, сколько люди все реже используют X Window клиент/серверную архитектуру (по крайней мере для того, что я наблюдаю за последние 10 лет).

PS: Я сделал это, чтобы запустить Firefox в своего рода "тюрьме" (чтобы избежать уязвимости, как для pdf.js в будущем). Но я быстро выяснил, что вызов Firefox через sudo не позволит ему получить доступ ни к аудио, ни к видеоаппаратуре. Но есть один парень, который ясно объясняет , как активировать аппаратное ускорение видео и аудио при вызове Firefox через sudo . YMMV с этими инструкциями, например, мне все еще отказано в разрешении на аудио, но видео нормально (протестировано на Fedora 22 с SELinux ON).

24
27.01.2020, 19:35

Учитывая, что вы используете Debian, простое и поддерживаемое решение - организовать sudo для копирования ваших учетных данных для авторизации X11. pam_xauth включен в пакет libpam-modules именно для этой цели; чтобы использовать его, вам просто нужно добавить

session  optional  pam_xauth.so

в ваш файл /etc/pam.d/sudo . Вы также можете добавить его в su . Для получения полной информации, конечно, обратитесь к странице руководства pam_xauth .

3
27.01.2020, 19:35

используйте эту команду, и она сработает

sudo cp /home/user/.Xauthority .Xauthority
-1
27.01.2020, 19:35

Что мне помогло:

  1. Вы можете xauth generate :0. trustedна стороне user, что создаст новыйMIT-MAGIC-COOKIE-1

  2. Проверьте вновь созданный ключ с помощью xauth list, так как userиroot(они должны быть одинаковыми, если ваша переменная XAUTHORITYуказывает на один и тот же файл.

  3. Вуаля, rootполучит доступ к любому приложению X с терминала, но только временно.

Чтобы сделать его постоянным, см. ответ @Huygens!

3
27.01.2020, 19:35

Альтернативное решение:

Такие службы, как cron, работающие под root, не имеют доступа к отображению, если текущий пользователь x не является root.

Нам просто нужно добавить пользователя root в x, вы можете сделать это во время входа в систему с помощью скрипта запуска

xhost local:root

В целях тестирования мы можем просто запустить команду than под текущим пользователем и перезапустить корневой скрипт/задание/службу/...

1
27.01.2020, 19:35

В команде sudoесть переключатель для сохранения переменных среды.

 -E, --preserve-env            preserve user environment when running command

Так что вы можете запустить команду с переключателем -E. Пример:

sudo -E wireshark

Если вам не нужно запускать критически важные для конфиденциальности приложения, такие как веб-браузеры, лучше добавить переключатель -E с помощью sudo. Мы не можем запустить Chrome или Firefox, просто добавив переключатель-E . Потому что во многих браузерах реализована защита от нарушений пользовательского пространства. Ответ @huygens может иметь представление по этому вопросу.

Примечание:Добавление переключателя -E не поможет, если в среде вашего пользователя НЕ установлены правильноDISPLAYиXAUTHORITY.

1
27.01.2020, 19:35

Теги

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