Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-05-26 14:30:09

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

uruchomienie programu jako user

Witam!
gdy wpisuje w emulatorze terminala (urxvt);

Kod:

root@stacjonarny:~# xprintidle 
No protocol specified
couldn't open display

Kod:

dominbik@stacjonarny:~$ xprintidle 
4

można jakoś uruchomić spod roota jako użytkownik lub ustawić ten 'display'?

potrzebne mi to, by ten skrypcik wykrywający idle działał w cronie od roota;
ale brał wartość xidle od usera (bo na roocie xów nie uruchamiam)

Kod:

#!/bin/bash
polecenie=$*
while [ $(bash /usr/share/silnik/uzycie_cpu.sh) -ge 10 ] || [ $(xprintidle) -le 20000 ]; do
sleep 50; done
$polecenie

Ostatnio edytowany przez dominbik (2012-05-26 14:35:44)


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#2  2012-05-26 15:26:39

  davidoski - Użytkownik

davidoski
Użytkownik
Skąd: Poznań
Zarejestrowany: 2007-04-17

Re: uruchomienie programu jako user

w KDE jest do tego kdesu, a w Gnome gksu, ale nie wiem czy zadziała w tym skrypcie

mam u siebie zrobiony taki myk z sudo i kdesu, który umożliwia uruchomienie aplikacji jako root bez podawania hasła i np. u mnie daje to taki wynik:

Kod:

davidoski@debian:~$ sudo kdesu xprintidle
Error: "/var/tmp/kdecache-davidoski" is owned by uid 1000 instead of uid 0.
131

davidoski@debian:~$ xprintidle
3

Ten error można usunąć, ale nie chciało mi się nigdy z tym walczyć, bo w zasadzie niczemu nie szkodzi. Nie wiem czy o to ci chodzi.

Ostatnio edytowany przez davidoski (2012-05-26 15:46:54)

Offline

 

#3  2012-05-26 16:10:57

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: uruchomienie programu jako user

dominbik napisał(-a):

Kod:

root@stacjonarny:~# xprintidle 
No protocol specified
couldn't open display

W środowisku roota nie ma zmiennej określającej klucz, za pomocą którego może autoryzować się w serwerze X.
Jak radzi davidoski, użyj gksu czy innego sux do uruchomienia terminala. A najlepiej su-to-root z pakietu menu.


dominbik napisał(-a):

potrzebne mi to, by ten skrypcik wykrywający idle działał w cronie od roota;
ale brał wartość xidle od usera (bo na roocie xów nie uruchamiam)

Kod:

#!/bin/bash
polecenie=$*
while [ $(bash /usr/share/silnik/uzycie_cpu.sh) -ge 10 ] || [ $(xprintidle) -le 20000 ]; do
sleep 50; done
$polecenie

Tutaj masz dwa czynniki. Jednym jest to, o czym pisałeś wyżej (problemy z autoryzacją). Drugim jest to, że cron nie ma pojęcia, jakiego DISPLAY ma użyć, gdyż zmienna ta jest ustawiana podczas uruchamiania X.
Z tego co pamiętam, wystarczy ustawić zmienną DISPLAY w cronie aby móc z jego poziomu podejmować interakcje ze środowiskiem graficznym.
Pozostaje jeszcze kwestia autoryzacji superużytkownika. Skoro skrypt jest uruchamiany jako root, możesz bez problemu wywoływać polecenia jako użytkownik (su <login> -c) — upewnij się tylko, że zmienna DISPLAY na poziomie użytkownika jest ustawiona (o ile dobrze pamiętam, że tyle wystarczy).
Masz też inne rozwiązania:
1. Uruchamiać cały skrypt jako użytkownik, a ewentualne polecenia które wymagają uprawnień administracyjnych uruchamiać przez odpowiednio skonfigurowane sudo. Ten sposób wybrałem ja w swoim skrypcie do backupów (a jeśli się nie mylę, Twój skrypt również ma wykonywać backupy).
2. Dodać sobie skrypt, który będzie działał cały czas, kiedy uruchomiony jest serwer X; powinien on w nieskończonej pętli co jakiś czas (5-10 sekund) uruchamić polecenie xprintidle i wynik zapisywać w jakimś pliku tymczasowym. Skrypt uruchamiany z crona przez roota będzie sobie odczytywał wartość z tego pliku. To rozwiązanie, dobrze zaimplementowane, będzie działać z automatu dla wszystkich sesji X uruchomionych przez różnych użytkowników. Będzie również odporne na dodawanie nowych i usuwanie dotychczasowych użytkowników z systemu.

Przy okazji: Twoja pętla najprawdopodobniej (nie sprawdzałem) się wywali, jeżeli żaden serwer X nie jest uruchomiony (nie wiem co wtedy zwraca xprintidle, ale zapewne jest to ciąg znaków, którego powłoka nie będzie potrafiła porównać z liczbą przy żądaniu porównania arytmetycznego).

davidoski napisał(-a):

Ten error można usunąć, ale nie chciało mi się nigdy z tym walczyć

To jest kwestia przekierowania wyjścia błędu do /dev/null. Ponieważ z rzadka może mieć to niepożądane konsekwencje, można kompromisowo wyjście błędu przekierować do pliku w /tmp/.

Offline

 

#4  2012-05-26 20:27:11

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: uruchomienie programu jako user

Minio napisał(-a):

Z tego co pamiętam, wystarczy ustawić zmienną DISPLAY w cronie aby móc z jego poziomu podejmować interakcje ze środowiskiem graficznym.

próbowałem przez

Kod:

env DISPLAY=:0 xprintidle > /home/dominbik/test

lecz nie dawało rezultatu zarówno w cron jak i konsoli. zauważyłem, że po xhost + działa
ale z tego co wiem wyłączanie tego nie jest bezpieczne.

Skoro skrypt jest uruchamiany jako root, możesz bez problemu wywoływać polecenia jako użytkownik (su <login> -c) — upewnij się tylko, że zmienna DISPLAY na poziomie użytkownika jest ustawiona (o ile dobrze pamiętam, że tyle wystarczy).

o to chodziło! działa z włączonym zabezpieczeniem xhost i bez kombinacji. w emulatorze terminala (w normalnych terminalach nie działa)

Kod:

su nazwa_usera -c xprintidle

- działa również w tty1, tty2 itd...

Kod:

env DISPLAY=:0 su nazwa_usera -c xprintidle

- mam nadzieję, że dodatkowo zadziała przy każdym użytkowniku (zwykle działa jeden na Xach).

Kod:

env DISPLAY=:0 su `users | awk '{ print $1}'` -c xprintidle

1. Uruchamiać cały skrypt jako użytkownik, a ewentualne polecenia które wymagają uprawnień administracyjnych uruchamiać przez odpowiednio skonfigurowane sudo. Ten sposób wybrałem ja w swoim skrypcie do backupów (a jeśli się nie mylę, Twój skrypt również ma wykonywać backupy).

tak myślałem o tym jako ostateczność.

2. Dodać sobie skrypt, który będzie działał cały czas, kiedy uruchomiony jest serwer X; powinien on w nieskończonej pętli co jakiś czas (5-10 sekund) uruchamić polecenie xprintidle i wynik zapisywać w jakimś pliku tymczasowym. Skrypt uruchamiany z crona przez roota będzie sobie odczytywał wartość z tego pliku. To rozwiązanie, dobrze zaimplementowane, będzie działać z automatu dla wszystkich sesji X uruchomionych przez różnych użytkowników. Będzie również odporne na dodawanie nowych i usuwanie dotychczasowych użytkowników z systemu.

też o tym myślałem, lecz ostatnio napisałem sobie kilka skryptów i niektóre problemy próbowałem właśnie na różne sposoby obchodzić - ostatecznie wolę stawiać na najprostsze rozwiązania. nawet zastanawiałem się czy nie lepiej wykorzystać statyczne uruchamianie backupu niż pisać ten skrypt.

Przy okazji: Twoja pętla najprawdopodobniej (nie sprawdzałem) się wywali, jeżeli żaden serwer X nie jest uruchomiony (nie wiem co wtedy zwraca xprintidle, ale zapewne jest to ciąg znaków, którego powłoka nie będzie potrafiła porównać z liczbą przy żądaniu porównania arytmetycznego).

tak. będę musiał dać warunek, że jeżeli user ma włączone Xy xprintidle zostanie wywołane. lecz póki co zastanawiam się jak to zrobić z pomocą ps. dodatkowo będę musiał jeszcze coś dopisać, bo zdarza się, że mnie nie ma, xscreensaver blokuje komputer/hibernuje - ktoś siada do komputera i daje przy pytaniu o hasło xscreensavera "New Login". wtedy xscreensaver klepie

Kod:

X -query moje_ip

i są tak jakby dwa Xy jednocześnie na F7 i F8 przy pomoc xdmcp.

Ostatnio edytowany przez dominbik (2012-05-26 20:41:47)


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#5  2012-05-26 22:53:09

  Pavlo950 - człowiek pasjonat :D

Pavlo950
człowiek pasjonat :D
Zarejestrowany: 2012-02-20
Serwis

Re: uruchomienie programu jako user

A z "xhost +" działa?

Offline

 

#6  2012-05-26 23:04:18

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: uruchomienie programu jako user

jeżeli na użytkowniku który używa obecnie Xów walnę xhost+ to działa. lecz ta metoda odpada całkowicie. użyję;

Kod:

env DISPLAY=:0 su `users | awk '{ print $1}'` -c xprintidle

chodź i tak będę musiał opakować to w skrypt do sprawdzający ile Xów uruchomionych oraz czy ktoś ma włączone Xy (dla menadżera logowania xprintidle nie działa)

Ostatnio edytowany przez dominbik (2012-05-26 23:04:48)


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#7  2012-06-02 11:06:41

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: uruchomienie programu jako user

jbc zrobiłem wkońcu tak ten skrypcik wykrycia idle dla backupa:
http://pastebin.com/raw.php?i=T9C5sRmZ

Ostatnio edytowany przez dominbik (2012-06-02 11:06:57)


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)