LINUX.ORG.RU
ФорумAdmin

makepkg -sri + many packages + type sudo password once

 , ,


0

2

Я пытаюсь автоматизировать update AUR пакетов (да, я знаю, что есть yaourt и yay), но я делаю это for fun, самообразования и нежелания пользоваться монстрами. Хотелось бы запустить скрипт и пойти себе. Скрипт простой - итерирует по директориям с клонами git пакетов aur, делает git reset –hard, git pull, makepkg –noconfirm -sri. И все бы хорошо, но установка каждого пакета требует введения пароля ([sudo] password for user: ) и вся автоматизация коту под хвост.

Может это можно как-то обойти? Каким-нибудь expect или чем-то подобным? Или на время выполнения скрипта увеличить время действия sudo и попросить пароль вначале?

  • Это поможет?
  • Из скрипта время действия sudo увеличить вообще возможно? А если да, то в какую сторону смотреть? sudo перегрузить как-то возможно?

PS Если кому-то интересно посмотреть на эти пару строчек bash’а (например с целью подсказать решение), то они тут: https://pastebin.com/68mcS5M3

Спасибо заранее!

не в ту сторону копаешь. Сначала собери все пакеты, а потом скорми их пакману одним запросом. Тебе не придется вводить пароль больше одного раза, если в скрипте всего одна команда с sudo (мем с негром, показывающим на висок)

anonymous ()
Ответ на: комментарий от anonymous

Некоторым пакетам перед сборкой могут понадобится обновлённые зависимости.

да, я знаю, что есть yaourt

yaourt-а уже нет. Да, в принципе работает, но в AUR уже нет.

package-query остался и даже обновляется.

greenman ★★★★★ ()
Последнее исправление: greenman (всего исправлений: 1)
Ответ на: комментарий от greenman

вот поэтому надо собирать в чруте, контейнере и т.п.

https://wiki.archlinux.org/index.php/DeveloperWiki:Building_in_a_clean_chroot

Хочешь заменить существующий пакет своим простым скриптом -> начинаешь курить тему -> вылезает куча тонкостей -> твой простой скрипт разрастается до размеров пакета, который ты хотел заменить. Классика жанра.

anonymous ()
Ответ на: комментарий от anonymous

У меня этих AUR пакетов 10 штук. Мне проще скрипт написать. Я осознаю, что в неи 100500 багов, но для моих 10 пакетов вероятность их появления мала. Кроме того, я хочу знать, что у меня из репозиториев, а что из AUR’ов.

Но впрочем это отмазки. На самом деле причины две:

  • Мне лень разбираться с очередным монстром типо yay
  • Я не для того ставил Arch, чтобы вообще не иметь понятия что в моем MS-DOS происходит. Правда каюсь, его установка меня так достала, что поставил Manjaro.

Я вот все-таки думаю, что временное отключение пароля sudo (или увеличение времени его действия на время работы говноскрипты поможет). Только вот как это сделать… Достаточно ли изменить /etc/sudoers и ничего не рестартовать? Придется проверить.

dissident ()

Можно разрешить судо без пароля. Только не надо про «секурность» - все равно товарищь хочет «запустить и забить», а это уже не айс.

bigov ()
Ответ на: комментарий от bigov

Я знаю, что можно разрешить sudo без пароля. Я не хочу этого делать. Я хочу это сделать на время работы быдлоскрипта. Этим компьютером пользуюсь только я. Если какой-то скрипт на 20 минут отключит пароль sudo (а потом назад включит) или увеличит длительность sudo (а следом вернет обратно), то ничего хуже чем NSA может сделать удаленно с моей задницей при помощи антены и усилителя не случится.

dissident ()
Ответ на: комментарий от bigov

PS А насчет «запустить и забить» ты когда делаешь «apt-get upgrade» или «pacman -Syu» то сидишь и пялишься в монитор, периодически нажимая «Да, я действительно хочу обновить этот пакет» при каждом пакете, который обновляется?

dissident ()
Последнее исправление: dissident (всего исправлений: 2)
Ответ на: комментарий от dissident

Мне лень разбираться с очередным монстром типо yay

yay из коробки делает то что тебе нужно. Опции там такие же, как в pacman. И называть это «монстром», чего?

anonymous ()
Ответ на: комментарий от anonymous

Ты не поверишь …, но «pacman -Syyu» один раз спрашивает :)

Это для обычных репозиториев. Я же итерирую по директориям с клонированными репами AUR, делаю pushd $dir; git reset –hard; git pull; makepkg -sri; popd, при этом глядя на PKGBUILD в $dir и только если версия из PKGBUILD не соответствует тому, что установлено в системе (и пакет вовсе установлен) для каждого AUR пакета отдельно, поэтому когда устанавливается каждый из них мне приходится нажимать Yes.

Ну если тебе все равно что там ставится то добавь в судо беспарольный pacman -S для своего юзера или под кем собираешь

Мне это нужно только для AUR пакетов. Причем временно. Которые поставил лично я. Для репозиториев я такие дырки делать не хочу.

https://vitux.com/how-to-specify-time-limit-for-a-sudo-session/

Я хочу это сделать временно, на время работы быдлоскрипта из 10 линий. Как это сделать на все время я знаю. Хотя можно сделать как-то так, как там описано в Set Sudo Session Last Till Terminal Closes, но это дырка (вдруг я забуду закрыть терминал… хотя его можно под конец скрипта закрыть автомагически).

yay из коробки делает то что тебе нужно. Опции там такие же, как в pacman. И называть это «монстром», чего?

Это же wrapper вокруг pacman? А он позволит мне узнать, что поставлено из AUR, а что из репозиториев? Плюс git clone aur_repo; makepkg -sri в том, что можно проверить поломан пакет из AUR, сильно ли поломан и стоит ли с ним возится, взять другой или забить. А так я запутаюсь, что я взял из репозитория, а что из менее доверительного AUR. Может у меня уже маразм.

PS Впрочем проще попробовать один раз спросить пароль sudo, изменить /etc/sudoers, посмотреть что получится и если получится, то по окончании работы скрипты вернуть обратно как было. В ближайшее время попробую.

PPS Я понимаю, что я делаю свои глаза красными, но хочется уже кончить. Тем более, что в своих 10 линиях баша я зачем-то пустые xargs напихал. Не знаю, что я тогда пил. Начал, хочу кончить. Спасибо за советы. Идея держать sudo пока терминал не закроется интересная, но не будет видно, что там произошло (ERROR там какой). Можно правда в лог писать.

dissident ()
Ответ на: комментарий от bigov

спасибо!

Ты мне кажется ответил:

Set Sudo Session Last Till Terminal Closes

Through a simple command, you can let your sudo session last
till you close the terminal, no matter how long the terminal
stays open. You will not be asked to enter your password for
any command that requires sudo permission after running this command:

$ sudo -s

Terminate the sudo session

After you have provided the password for sudo, you can terminate
the sudo session even before the time limit specified in the
sudoers file, through the following simple command:

$ sudo -k

Please note that this command will not terminate the session if
you have used the “sudo -s” during a terminal session.

So, this is how you can shorten or lengthen the time duration for
a sudo session by making a one-line change in the /etc/sudoers
file. You can also use other commands mentioned in this article
to terminate the sudo session or make it last till the terminal
session lasts.

Перед началом скрипта делаем sudo echo > /dev/null или еще какой-нибудь бред, следом sudo -s, следом быдлоскрипт, под конец sudo -k.

Спросите и вем ответят. Оригато!

dissident ()
Ответ на: комментарий от anonymous
#репы
pacman -Qn
#aur
pacman -Qm

А как я починю поломанный AUR пакет? Склонировав его, я могу сделать с ним, что угодно, чтобы он собрался. А yay мне скажет «не поставлю, потому что ваши носки воняют».

dissident ()
Ответ на: комментарий от dissident

А как я починю поломанный AUR пакет? Склонировав его, я могу сделать с ним, что угодно, чтобы он собрался. А yay мне скажет «не поставлю, потому что ваши носки воняют».

Впрочем наверняка они и так склонированы в какой-нибудь /var. Вы меня почти убедили, спасибо!

dissident ()
Ответ на: комментарий от dissident
sudo -k
[skip]
Please note that this command will not terminate the session if
you have used the “sudo -s” during a terminal session.

Это не работает, по крайней мере в терминале (может в скрипте работает). Зато вероятно заработает так:

sudo -s
[sudo] password for user:
<быдлоскрипт>
sudo_s_pid=`pgrep sudo`
kill -9 $sudo_s_pid

И 10 линий баша заменяют yay…

dissident ()
Последнее исправление: dissident (всего исправлений: 3)
Ответ на: комментарий от dissident

Возможно

sudo_s_pid=`pgrep sudo`
kill -9 $sudo_s_pid

можно будет заменить на:

sudo -k

если это будет не «terminal session» а скрипт запущенный через /bin/bash -s (например из dmenu).

PS Я прошу прощения за столько спама, за это время уже давно мог бы все сделать, но хочется сначала в голове у себя все уложить. А может у меня NIH синдром, ADHD и биполярное расстройство. В любом случае еще уще раз спасибо.

PPS Не выйдет - буду курить yay.

dissident ()
Последнее исправление: dissident (всего исправлений: 1)

Самое простое решение которое нашел: https://gist.github.com/cowboy/3118588. В итоге в начале скрипта:

# From https://gist.github.com/cowboy/3118588
prevent_asking_sudo_password()
{
    # Might as well ask for password up-front, right?
    sudo -v     
        
    # Keep-alive: update existing sudo time stamp if set, otherwise do nothing.
    while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/nul
}
            
prevent_asking_sudo_password
dissident ()
Ответ на: комментарий от anti_win

Что ты с ним делал, что его надо постоянно переустанавливать? Это же не убунта, в конце-концов!

Эээ… Нуу… Ну пить надо меньше (потерянные/пропитые лаптопы и т.д.) :-|

dissident ()
Ответ на: комментарий от buratino
  • пытаешься собрать пакет из-под рута
  • видишь сообщение об ошибке
  • открываешь /usr/bin/makepkg (это скрипт на баше) в текстовом редакторе и ищешь это сообщение
  • удаляешь найденный кусок кода
  • профит!
anonymous ()
Ответ на: комментарий от anonymous

Можно наверное еще вот это попробовать ревертнуть:

https://www.mail-archive.com/pacman-dev@archlinux.org/msg00541.html

(see http://allanmcrae.com/2015/01/replacing-makepkg-asroot/)

AFAIU самое главное это как заметил anonymous ревертнуть вот это:

 if [ "$INFAKEROOT" = "0" ]; then
-	if [ $EUID -eq 0 -a "$ASROOT" = "0" ]; then
+	if [ $EUID -eq 0 ]; then
+		ASROOT="0"
 		# Warn those who like to live dangerously.
-		error "$(gettext "Running makepkg as root is a BAD idea and can cause")"
-		plain "$(gettext "permanent, catastrophic damage to your system. If you")"
-		plain "$(gettext "wish to run as root, please use the --asroot option.")"
-		exit 1 # $E_USER_ABORT
-	elif [ $EUID -gt 0 -a "$ASROOT" = "1" ]; then
-		# Warn those who try to use the --asroot option when they are not root
-		error "$(gettext "The --asroot option is meant for the root user only.")"
-		plain "$(gettext "Please rerun makepkg without the --asroot flag.")"
-		exit 1 # $E_USER_ABORT
+		warning "$(gettext "Running makepkg as root is a BAD idea and can cause")"
+		plain "$(gettext "serious damage to your system.")"
 	elif [ "$(check_buildenv fakeroot)" = "y" -a $EUID -gt 0 ]; then
 		if [ ! $(type -p fakeroot) ]; then

и не проверять ASROOT вовсе.

dissident ()
Последнее исправление: dissident (всего исправлений: 2)