Skocz do zawartości

dnf i wybór: [y/N] z "zewnątrz"


Radosław

Rekomendowane odpowiedzi

Aktualizuję sobie system dnf'em z użyciem kdialog (lista), a w konsoli wyskakuje co będzie się aktualizowało i czy potwierdzam lub rezygnuję:

 

Podsumowanie transakcji:
 Aktualizowanie:                       33 pakietów
 Zastępowanie:                         33 pakietów

Całkowity rozmiar pakietów przychodzących wynosi 97 MiB. Należy pobrać 97 MiB.
Po tej operacji zostanie użyte dodatkowo 396 KiB (zainstaluje 353 MiB, usunie 353 MiB).
Is this ok [y/N]:

Mam pid'a dnf'a robiącego tę aktualizację. w drugim terminalu daję:

echo -en "y\n" > /proc/[PID DNF'a]/fd/0

w terminalu aktualizacji wskakuje "y" i przełamuje Return tak jak by potwierdzenie wskakuje, ale proces nie idzie.

Próbowałem też pid'a tego bash'a i pid'a okna konsoli KDE. Pojawia się "y" z Enterem, ale nie idzie.

Co robię źle?

 

Radek Głębicki

 

PS: docelowo chcę wychwycić pojawianie się [y/N] i dać kdialog Yes No
 

Odnośnik do komentarza
Udostępnij na innych stronach

3 godziny temu, Radosław napisał:

Co robię źle?

Zakładasz, że to działa tak jak Ci się wydaje, a tak nie jest :)

 Pisanie do stdin programu przez jego fd nie jest równe "pisaniu z klawiatury" czy nawet np. przekierowaniu "<"

Aby "symulować" trzeba użyć ioctl dla terminali

man ioctl_tty

Prosty program wysyłający znak "y" w pythonie

# tty.py

import sys
import fcntl
import termios

with open(sys.argv[1], 'w') as fd:
    for char in "y\n":
        fcntl.ioctl(fd, termios.TIOCSTI, char)

Uruchomienie

python tty.py /proc/PID_DNF/fd/0

PS.

Może łatwiej podziel to na etapy

dnf5 check-upgrade --refresh

I jak Ci opowiada to uruchom 

sudo dnf upgrade --assumeyes

Edytowane przez sunrise
Odnośnik do komentarza
Udostępnij na innych stronach

Ciekawe jest, że myślisz, że to ja "zakładam, że tak to działa". Po prostu szukałem w necie i znalazłem to z echo, a nic z ioctl.

to podpowiedź z dnf to odpada. Ja nie aktualizuję wszystkiego na raz. Gdzieś tu na forum zrobiłem wątek z użycia kdialog z wyborem pakietów do instalacji. Instaluję aktualizacje grupami ([y/N] wolę mieć, aby przerwać (użycie --assumeyes odpada) i co jakich czas sobie clonezillą zgrywam stan partycji  / (root). 

Oczywiście popróbuję coś zdziałać z ioctl. Dzięki za podpowiedź.

Radek Glebicki

PS.: nawet sobie w Pythonie z użycie QT napisałem własny "kdialog list" z "live filter" i  "grep -v" :-D

 

filterList.png

Odnośnik do komentarza
Udostępnij na innych stronach

@sunrise jeszcze pytanko.

Próbuję zrozumieć ten skrypt. Czytam manuale. Niepokoi mnie "w" czyli "write: w:

Cytuj
with open(sys.argv[1], 'w') as fd:

Czym grozi pomyłka w ścieżce z sys.argv[1] dla pomylonego pliku/katalogu ?

Pozdrawiam

Radek Glebicki

Odnośnik do komentarza
Udostępnij na innych stronach

Godzinę temu, Radosław napisał:

Czym grozi pomyłka w ścieżce z sys.argv[1] dla pomylonego pliku/katalogu ?

Generalnie grozi tym, że będziesz wysyłał ciąg znaków nie do tego "pliku" co chcesz, a co się zdarzy, to już zależy od tego do jakiego "pliku".

Jeżeli będzie to urządzenie znakowe (np. terminal lub port szeregowy) no to wyślesz do niego ten ciąg, a co on  z nim zrobi to już zależy od procesu.

A jak wyślesz do zwykłego pliku to program "się wykrzaczy" ponieważ to nie jest urządzenie znakowe i w tym prostym przykładzie nie ma napisanej obsługi błędów.

np. przy zapisie do zwykłego pliku.

# python tty.py zwykly_plik 
Traceback (most recent call last):
  File "/root/tty.py", line 7, in <module>
    fcntl.ioctl(fd, termios.TIOCSTI, char)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 25] Inappropriate ioctl for device


 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...