Puncte:1

Lubuntu 20.04 Rulați un script la logare care se execută într-o fereastră de terminal

drapel mx

Scopul meu: Executați un script shell după autentificare care rulează cu privilegii de rădăcină și preia intrarea corespunzătoare a utilizatorului dintr-o fereastră de terminal pentru a determina următorul curs de acțiune.

Scenariul: Scriptul pe care îl rulez îi spune utilizatorului că un al doilea script va fi inițiat automat în 60 de secunde, cu excepția cazului în care utilizatorul introduce s sau S. O numărătoare inversă afișează timpul rămas. Dacă utilizatorul a introdus comanda de ieșire corectă, scriptul se termină și sistemul continuă ca de obicei. Dacă nu este introdus nimic valid în 60 de secunde, atunci este inițiat al doilea script. Al doilea script trebuie să fie executat și ca root (de aceea primul trebuie inițiat ca root), deoarece are un watchdog care execută o repornire hard a sistemului în cazul unei defecțiuni hardware.

Bash Script:

#!/bin/bash

#Prompt utilizatorul cu informații.

echo „Minerul va începe în 60 de secunde”.
echo "Apăsați s + enter pentru a opri procesul și a relua funcționarea normală."

#Declară variabile.

input="a"
lasă secunde=60

#Așteptați intrarea utilizatorului și numărătoarea inversă.

while [ $secunde -gt 0 ]; do
    printf „\r.........”$secunde
    citiți -s -t 1 intrare
    lasă „secunde-=1”
    dacă [ "$input" = "s" ] || [ "$input" = "S" ]; atunci
        pauză
    fi
Terminat

ecou

#Inițiază selecția utilizatorului

dacă [ "$input" = "s" ] || [ "$input" = "S" ]; atunci
    echo „Reluarea funcționării normale”.
    somn 2
altfel
    echo „Pornirea minerului”.
    somn 2
    ./TeamRedMiner_Config.sh
fi

Scop: Acest script este menit să repornească un program de mining după ce watchdog-ul repornește sistemul în cazul unei defecțiuni a GPU-ului. Solicitarea utilizatorului îmi dă timp să opresc executarea minerului după conectare dacă vreau să folosesc sistemul normal. De obicei sunt departe de sistem, așa că acest lucru este destul de important pentru a menține operațiunea de minerit. Defecțiunea GPU-ului este destul de comună după ce a rulat 2 + zile (în ciuda underclock, undervolt, etc.) pentru una dintre cardurile mele, deoarece ea îmbătrânește foarte mult în acest moment (peste 6 ani).

Am făcut o mulțime de cercetări și încă nu am găsit o soluție care să funcționeze pentru mine. Majoritatea se concentrează pe executarea unui script care nu necesită intrare externă sau fereastră de terminal. Dacă o face, atunci sunt doar câteva comenzi. Am nevoie de ceva care să lanseze o fereastră de terminal, astfel încât să pot vedea solicitările și numărătoarea inversă. În plus, am nevoie de fereastra terminalului pentru a afișa starea minerului după lansare.

Ceea ce am incercat:
Condiții inițiale: fișierul este .sh, executabil și deținut de root.

  1. Utilizați systemd pentru a executa scriptul ca fișier .service (nu s-a întâmplat nimic)
  2. Utilizați crontab pentru a executa scriptul la pornire (nu s-a întâmplat nimic)
  3. Plasarea scenariului în profil.d (Lubuntu a durat mai mult să se autentifice, deși nu s-a întâmplat nimic)
  4. Editarea $HOME/.bashrc și $HOME/.profil fisiere prin adaugare ./AutoStartMiner.sh în partea de sus a fișierelor (a rezultat într-o blocare a sistemului)

Sperăm că acest lucru arată că am depus mult efort și că putem găsi o soluție la această problemă. Mulțumiri!

sudodus avatar
drapel jp
1. `sudo crontab -e` este modalitatea de a introduce un job cron pentru root. Dar nu știu cum să fac ca asta să interacționeze cu un utilizator; Aveți nevoie de o cale completă către toate programele (sau specificați variabila PATH în Rontab; 2. Puteți utiliza **autostart** în schimb.[Acest exemplu](https://askubuntu.com/questions/1251814/xrandr-command-in-startup-script-has-no-effect-but-script-does-run-and-command/1251882#1251882) ar putea vă ajută să vă creați jobul de pornire automată. Cred că ar trebui să acordați timp utilizatorului să introducă parola [utilizator] pentru ca sarcina sudo să funcționeze, deoarece scriptul va (și ar trebui) probabil să ceară parola.
XXX_BlueFire_XXX avatar
drapel mx
De fapt, vreau să ocolesc introducerea parolei în acest caz, deoarece este posibil să nu mă aflu în fața sistemului însuși atunci când scriptul este executat. În esență, repornește minerul după ce sistemul a întâmpinat o eroare critică. În cazul în care mă aflu în fața sistemului și intenționez să nu pornesc minerul, vreau să apară fereastra terminalului și să afișeze o opțiune pentru a opri inițierea automată a scriptului. M-am gândit să folosesc pornirea automată LXQT; totuși, am avut impresia că nu rulează ca script ca root, ceea ce este foarte important în această situație.
sudodus avatar
drapel jp
Dacă nimeni nu va putea profita de o gaură de securitate, puteți 1. folosi `sudo -S` și chiar introduceți parola în text clar în shellscript. Dar este o idee proastă; 2. Este mai bine să folosiți `visudo` și să permiteți doar un anumit program sau script să fie executat cu sudo fără parolă. Consultați [acest link](https://www.computerhope.com/unix/visudo.htm). Puteți găsi multe alte tutoriale dacă căutați pe internet „visudo” sau un alt șir de căutare relevant.
XXX_BlueFire_XXX avatar
drapel mx
Securitatea pe această mașină nu este o preocupare prea mare; cu toate acestea, personal îmi place să păstrez lucrurile cât mai sigure posibil în timp ce ating un obiectiv. Voi analiza visudo ca o modalitate de a rula un script shell ca root fără parolă. Acesta este un pas bun; cu toate acestea, încă nu știu cum exact aș face ca sistemul să ruleze scriptul după ce ajung la desktopul GUI.
sudodus avatar
drapel jp
Consultați și [acest link AskUbuntu](https://askubuntu.com/questions/246455/how-to-give-nopasswd-access-to-multiple-commands-via-sudoers), care ar putea fi mai relevant pentru cazul dvs.
sudodus avatar
drapel jp
Vezi linkul din primul meu comentariu. Autostart funcționează așa pentru mine în Lubuntu 20.04.x.
XXX_BlueFire_XXX avatar
drapel mx
Da, vă voi anunța cum merge înainte folosind metoda Autostart. Poate că s-a schimbat în versiunile ulterioare de Lubuntu.
sudodus avatar
drapel jp
Comentați despre „Al doilea script trebuie să fie executat și ca root (de aceea primul trebuie inițiat ca root), deoarece are un watchdog care execută o repornire hard a sistemului în cazul unei defecțiuni hardware.”: I sugerăm să nu rulați toate scripturile ca root, ci **doar watchdog** (numit în mod specific cu `sudo` în al doilea script. Aceasta înseamnă că ar trebui să permiteți execuția cu `NOPASSWD` a watchdog-ului (setat prin ` visudo`).
Puncte:1
drapel mx

Bine, a trecut ceva timp, deși în sfârșit am avut timp să mă așez și să-mi scriu soluția. A fost prima dată când am scris un script bash, așa că a fost interesant.

Am ajuns să folosesc o combinație de 3 scripturi, dintre care 2 au primit permisiuni de root în fișierul sudoers. Poate că există o modalitate mai bună de a face acest lucru; cu toate acestea, am pus pur și simplu calea completă către script.

sudo visudo

Apoi sub fila #includedir /etc/sudoers.d

userName ALL=NOPASSWD PATH/AutoStartMiner.sh, PATH/TeamRedMiner_Config.sh, Path/teamredminer

Acest lucru ar pregăti scena pentru ca cele 3 scripturi să funcționeze unul după altul fără probleme.

Pentru a porni AutoStartMiner.sh într-o fereastră de terminal, am folosit emulatorul gnome-terminal. Pentru cei care implementează ceva similar, va trebui să instalați emulatorul prin:

sudo apt install gnome-terminal

Apoi am folosit centrul de configurare LXQT și am navigat la setările sesiunii. În setările de sesiune am setat scriptul StartTerminalASM.sh să se execute după ce s-a încărcat tava de sistem. Acest lucru a fost realizat prin apăsarea adăugării, dând un nume funcției de pornire automată, lipirea întregii căi către script, inclusiv scriptul în sine, și apoi făcând clic pe caseta care spune încărcare după bara de sistem. Este important de reținut că acest prim script nu trebuie să ruleze cu privilegii ridicate, așa că această metodă funcționează. Funcția de pornire automată a LXQT nu rulează automat scripturi care necesită privilegii ridicate.

Iată conținutul primului script: StartTerminalASM.sh

#!/bin/bash
gnome-terminal --command="bash -c 'sudo /home/userName/Scripts/AutoStartMiner.sh; $SHELL'"

Acest script pur și simplu pornește AutoStartMiner.sh într-un terminal gnome. Deoarece am adăugat mai devreme acest script în fișierul sudoers, comanda sudo se execută fără o solicitare de parolă.

Iată al doilea script: AutoStartMiner.sh

#!/bin/bash
# Solicitați utilizatorului informații.
echo „Minerul va începe în 60 de secunde”.
echo "Apăsați s + enter pentru a opri procesul și a relua funcționarea normală."
# Delare variabile.
input="a"
lasă secunde=60
#Așteptați intrarea utilizatorului și numărătoarea inversă.
while [ $secunde -gt 0 ]; do
  printf „\r.........”$secunde
    citiți -s -t 1 intrare
    lasă „secunde-=1”
    dacă [ "$input" = "s" ] || [ "$input" = "S" ]; atunci
        pauză
    fi
Terminat
ecou
#Inițiază selecția utilizatorului
dacă [ "$input" = "s" ] || [ "$input" = "S" ]; atunci
    echo „Reluarea funcționării normale”.
    somn 2
altfel
    echo „Pornirea minerului”.
    somn 2
    sudo /home/userName/Documents/Crypto/Miners/TeamRedMiner/teamredminer-v0.8.4-linux/TeamRedMiner_Config.sh
fi

Deci, acest lucru funcționează în esență așa cum am descris în întrebarea inițială. Singura problemă pe care o are este că atunci când timpul scade sub 10 secunde, dintr-un motiv oarecare, apare un 0 pe locul 1 și numerele numără invers pe locul 10 (de exemplu, 10, 90, 80, 70, ... etc. ). Probabil ceva ce nu înțeleg pe deplin despre printf declarația pe care am făcut-o. În mod similar, mai sus, sudo comanda aici nu cere o parolă din cauza liniei create în sudoers.

În cele din urmă, execută un al treilea script: TeamRedMiner_Config.sh

Acest script stabilește pur și simplu parametrii pentru ca minerul să ruleze. De asemenea, execută minerul cu sudo, de aceea adăugăm o a treia comandă la sudoers pentru a ne asigura că nu este necesară nicio solicitare pentru a porni minerul în sine.

Deci, dacă utilizatorul nu solicită sistemului să oprească pornirea minerului, minerul va executa fără nicio introducere. Acest lucru este extrem de util, deoarece mă scutește de o mulțime de dureri de cap dacă nucleul se blochează. Pur și simplu apăs pe butonul de pornire și boom, minerul rulează un minut mai târziu. Dacă aș vrea cu adevărat să-l automatizez, aș putea face un mic servo pentru a apăsa butonul sau a seta wake pe lan.

Acestea fiind spuse, este vorba despre cea mai recentă problemă. După actualizarea la Linux kernel 5.11.0-27-generic, adaptorul meu wireless refuză să se conecteze la rețeaua mea, deși cel puțin este recunoscut de sistem.

Mulțumesc tuturor pentru contribuție și sper că acest lucru îi va ajuta într-o zi pe alți începători ca mine.

tripleee avatar
drapel nz
Rularea scriptului într-o fereastră de terminal pare un design slab. Dacă doriți ca ceva să ruleze concomitent, porniți-l ca un job de fundal cu ieșire într-un fișier jurnal și atașați-l la acel fișier jurnal de oriunde se întâmplă să fiți conectat pentru a vedea ce face.
XXX_BlueFire_XXX avatar
drapel mx
Fereastra terminalului trebuia să permită introducerea utilizatorului. În prezent, acesta este singurul mod în care știu cum să permit unui utilizator să interacționeze cu un script. Deși, dacă există o altă cale, sunt cu siguranță deschis să învăț.
Puncte:1
drapel jp

Sistem de pornire automată în care piesa rulează cu permisiuni ridicate

Următoarea metodă ar trebui să funcționeze pentru a obține un scut pornește automat, când pornește computerul. Vă rugăm să modificați fișierele șablon din acest răspuns pentru a se potrivi cu ID-ul dvs. de utilizator și cu numele fișierului programului Watchdog.

Notă: vă sugerez să nu rulați toate scripturile ca rădăcină, ci doar watchdog (numit în mod specific cu sudo în al doilea script. Aceasta înseamnă că ar trebui să permiteți execuția cu NOPASSWD al câinelui de pază (setat prin visudo).

~/.config/autostart/shield.desktop

[Intrare pe desktop]
Nume = scut la tester
Comentariu=Scut numai pentru testare
Exec=/home/tester/bin/shield
Terminal=fals
Tip=Aplicație
StartupNotify=true
X-GNOME-Autostart-enabled=adevărat

Vedea acest link, care descrie cum să faci un program să pornească automat atunci când computerul ajunge la desktop la pornire cu Lubuntu 20.04.x ​​LTS.

./bin/shield

#!/bin/bash 

xterm -display :0 -fullscreen -fa default -fs 16 -e bash -c \
'
tme=10 # perioadă de grație în secunde înainte de începerea extragerii

ecou „Opriți? (s/q)”

în timp ce [ "$tme" -gt "0" ]
do
 echo -n "$tme"
 tme=$((tme-1))
 citeste -t1 -n1 ans
 dacă [ "$ans" == s ] || [ "$ans" == S ] \
 || [ "$ans" == q ] || [ "$ans" == Q ];atunci
  echo " - computerul este al tău"
  dormi 2
  Ieșire
 fi
Terminat

echo " - acțiune automată, începe extragerea"
echo "$ sudo -H separat -ls # demo cu programul care are nevoie de sudo"
sudo -H despărțit -ls
în timp ce adevărat
do
 echo -n "."
 citește -t1 -n1 -s an2
 if [ "$an2" != "" ];atunci
  echo " - mineritul s-a oprit, computerul este al tău"
  somn 3
 Ieșire
 fi
Terminat'
  • sudo ar trebui să-ți sune câinele de pază în loc de despărțit
  • De asemenea, puteți modifica perioada de grație tme de la 10 la 60 (secunde).

/etc/sudoers

#
# Acest fișier TREBUIE editat cu comanda „visudo” ca root.
#
# Vă rugăm să luați în considerare adăugarea de conținut local în /etc/sudoers.d/ în loc de
# modificând direct acest fișier.
#
# Consultați pagina de manual pentru detalii despre cum să scrieți un fișier sudoers.
#
Valori implicite env_reset
Valoarea implicită mail_badpass
Valori implicite secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Specificație alias gazdă

# Specificația aliasului utilizatorului

# Cmnd specificația aliasului

# Specificarea privilegiilor utilizatorului
root ALL=(ALL:ALL) ALL

# Membrii grupului de administrare pot obține privilegii de root
%admin ALL=(ALL) ALL

# Permite membrilor grupului sudo să execute orice comandă
%sudo ALL=(ALL:ALL) ALL

# Consultați sudoers(5) pentru mai multe informații despre directivele „#include”:

#includedir /etc/sudoers.d

%tester ALL=NOPASSWD: /usr/sbin/parted

Ultima linie (și o linie goală) sunt adăugate la fișierul implicit. Modificați-l pentru ID-ul dvs. de utilizator și numele programului dvs. de supraveghere.

Următoarele linkuri explică cum să editați sudoeridosar cu visudo:

Permise și proprietate

-rwxrwxr-x tester/tester 649 2021-07-26 15:14 ./bin/shield
-rwxrwxr-x tester/tester 181 2021-07-26 14:47 ./.config/autostart/shield.desktop
-r--r----- root/root 795 2021-07-26 14:19 etc/sudoers

Acest lucru a funcționat pentru mine când am testat. Poate doriți să modificați permisiunile și dreptul de proprietate. Dar nu ar trebui să fie riscant atunci când limitați NOPASSWD caracteristică programului watchdog.

The scut este pe tot ecranul și arată așa

Când îl întrerupeți în timpul perioadei de grație înainte de minerit:

introduceți descrierea imaginii aici

Când îl lași să înceapă mineritul, simulat aici cu despărțit și puncte (.....), și în cele din urmă opriți minarea pentru a utiliza computerul în alte scopuri:

introduceți descrierea imaginii aici

Poate doriți să modificați dimensiunea textului xterm fereastra din -fs 16.

XXX_BlueFire_XXX avatar
drapel mx
Bună sudodus, mulțumesc pentru timpul acordat pentru a răspunde la întrebare atât de amănunțit. În timpul meu liber, am reușit să găsesc o altă soluție pe care o voi posta mai jos când voi avea ceva timp. În plus, sunt nerăbdător să încerc soluția ta pe o altă mașină, ca să pot învăța. Mulțumiri!
sudodus avatar
drapel jp
Sunteți binevenit și aștept cu nerăbdare soluția dvs. :-)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.