Si të ekzekutoni një skript lokal në një server Linux në distancë


Skriptimi i detyrave të përsëritura përmirëson efikasitetin e administrimit të sistemit. Kjo është e shkëlqyeshme për makinat lokale, por çka nëse mbikëqyr serverët në distancë? A mund të ekzekutoni një skript lokal në një kompjuter në distancë? Po!

Lidhjet në distancë

Administrimi në distancë i sistemit zakonisht përfshin lidhjen me kompjuterin në distancë nëpërmjet një lidhjeje she sigurt. Lidhja SSH ju ofron një linjë komande në kompjuterin e largët. Më pas mund të shkoni menjëherë përpara dhe të kryeni çdo mirëmbajtje të sistemit që kërkohet.

Skriptimi i shell ndihmon duke ju lejuar të mbështillni një sekuencë komandash në një skript që mund të ekzekutohet sikur të ishin një program, duke kombinuar shumë veprime në një udhëzim të linjës së komandës.

Me kalimin e kohës, ju do të ndryshoni dhe përmirësoni skriptet tuaja. Nëse keni shumë makina të largëta për të administruar, mbajtja e kopjes së çdo skripti në çdo server të përditësuar dhe aktuale është një dhimbje dhe një shpenzim i jashtëzakonshëm. Ajo bëhet një detyrë administrative në vetvete dhe konsumon kursimet e kohës që supozohet të japë përdorimi i skripteve.

Zgjidhja ideale do t'ju lejojë të mbani skriptet tuaja në kompjuterin tuaj lokal dhe t'i ekzekutoni ato në kompjuterët e largët përmes lidhjes SSH. Kjo do t'ju jepte menaxhim të thjeshtuar me një koleksion të centralizuar skriptesh, dhe i njëjti skenar i përditësuar funksionon në të gjithë kompjuterët.

Bash dhe SSH ofrojnë një mënyrë për ta bërë këtë.

Lidhje SSH pa fjalëkalim

Mënyra më e mirë për ta bërë këtë është me lidhje pa fjalëkalim, duke përdorur çelësat SSH. Duke gjeneruar çelësa SSH në kompjuterin tuaj lokal dhe duke i dërguar në secilin nga kompjuterët e largët, ju mund të lidheni me kompjuterët e largët në mënyrë të sigurt dhe të përshtatshme, pa u kërkuar çdo herë një fjalëkalim.

Megjithëse mund të jenë frikësues për përdoruesit për herë të parë, çelësat SSH nuk janë vërtet të vështirë. Ato janë të lehta për t'u gjeneruar, të thjeshta për t'u instaluar në serverët e largët dhe pa fërkime kur i përdorni me SSH. Parakushtet e vetme janë që kompjuterët në distancë të kenë demon SSH sshd që funksionon dhe që të keni një llogari përdoruesi në kompjuterin në distancë.

Nëse tashmë po kryeni administrim të sistemit në distancë mbi to, të dyja këto kërkesa duhet të përmbushen tashmë.

Për të gjeneruar një çift çelësash SSH, shkruani:

ssh-keygen

Nëse keni një llogari të quajtur dave në një kompjuter të quajtur fedora-36.local, mund të dërgoni dhe instaloni çelësin tuaj publik SSH në të me këtë komandë:

ssh-copy-id dave@fedora-36.local

Tani, duke bërë një lidhje SSH në mënyrën e zakonshme do të vërtetohet duke përdorur çelësat SSH. Ju futeni në një linjë komande në serverin në distancë pa u kërkuar një fjalëkalim.

ssh dave@fedora-36.local

Ekzekutimi i një skripti lokal nga distanca

Për këto teste, serveri ynë në distancë është një kompjuter Linux i quajtur fedora-36.local. Ne kemi konfiguruar çelësat SSH dhe kemi testuar lidhjen tonë pa fjalëkalim me serverin në distancë nga kompjuteri ynë lokal.

Skenari ynë është shumë i thjeshtë. Ai shkruan një vulë kohore në një skedar të quajtur timestamp.txt, në serverin e largët. Vini re se skripti përfundon me komandën e daljes. Kjo është e rëndësishme, në disa sisteme të vjetra është e mundur që një skript të ekzekutohet deri në përfundim, por lidhja SSH mbahet e hapur.

#!/bin/bash

date >> timestamp.txt

exit 0

Kopjojeni këtë tekst në një redaktues, ruajeni si local.sh dhe më pas përdorni chmod për ta bërë atë të ekzekutueshëm.

chmod +x local.sh

Në makinën tonë lokale, ne do të hapim skenarin si ky:

ssh dave@fedora-36.local 'bash -s' < local.sh

Ja se si funksionon kjo.

  • ssh dave@fedora-36.local: Lidhja SSH që po bëjmë me makinën në distancë. Kjo përdor komandën ssh, llogarinë para-ekzistuese të përdoruesit në serverin në distancë dhe adresën e serverit në distancë.
  • 'bash -s': Kjo bën që Bash të lexojë komandat nga rrjedha standarde e hyrjes. Lejon Bash të lexojë hyrjen e ridrejtuar ose me tubacion.
  • < local.sh: Po e ridrejtojmë skenarin në Bash.

Kur skripti ekzekutohet, ne kthehemi në vijën e komandës së makinës lokale. Duke u hedhur mbi makinën tonë në distancë, mund të përdorim cat për të parë brenda skedarit timestamp.txt.

cat timestamp.txt

Ne mund të shohim vulën kohore të lidhjes së fundit dhe aktualisht të vetme. Ekzekutimi i skriptit lokal disa herë të tjera shton vulat kohore përkatëse në skedarin në distancë.

cat timestamp.txt

Sigurisht, në një situatë të botës reale, skenari juaj do të bënte diçka më të dobishme. Por edhe shembulli ynë i parëndësishëm tregon se një skrip lokal po ekzekutohet në një server të largët.

Kalimi i argumenteve në skenar

Ju mund t'i kaloni skriptit argumentet e linjës së komandës. Ne do ta modifikojmë skriptin tonë për të pritur tre parametra të linjës së komandës. Këto ridrejtohen në skedarin timestamp.txt së bashku me vulën kohore.

Ruaje këtë skript si local2.sh dhe bëje të ekzekutueshëm me chmod.

#!/bin/bash

echo "$1 $2 $3" >> timestamp.txt
date >> timestamp.txt

exit 0

Komanda që duhet të përdorim është e ngjashme me shembullin e mëparshëm, me disa ndryshime.

ssh dave@fedora-36.local "bash -s" -- < local2.sh "How-To\ Geek" "Linux" "Articles"

Viza e dyfishtë -- i thotë Bash se ajo që vijon nuk duhet të konsiderohet si parametra të linjës së komandës për komandën ssh. Tre parametrat për skriptin ndjekin emrin e skriptit, si zakonisht. Vini re se ne kemi përdorur një vijë të prapme \ për t'i shpëtuar hapësirës në parametrin How-To\ Geek.

Mund të kontrollojmë me cat nëse parametrat tanë janë marrë dhe janë trajtuar saktë në serverin në distancë.

cat timestamp.txt

Drejtimi i një seksioni të një skripti nga distanca

Nëse keni një skript që duhet të bëjë disa përpunime lokale për të përcaktuar se çfarë veprimesh mund të kërkohen në serverët në distancë, mund të shtoni një seksion direkt në atë skript për të kryer veprimet në distancë për ju.

Këtë mund ta arrijmë duke përdorur dokumente këtu. Këtu dokumentet na lejojnë të ridrejtojmë linjat nga një seksion i etiketuar i një skripti në një komandë. Përpunimi lokal mund të kryhet sipër dhe poshtë dokumentit këtu.

Ky është skripti “local3.sh”, i cili përmban një dokument këtu.

#!/bin/bash

# local processing can done here

# remote processing is done here
ssh -T dave@fedora-36.local << _remote_commands

# commands to be run remotely would be added here
cd /home/dave/Documents
# etc.

# Finally, update the timestamp file
echo "Script3.sh:" $(date) >> /home/dave/timestamp.txt

# this is the label that marks the end of the redirection
_remote_commands

# more local processing can be done here

exit 0

Ne po përdorim komandën ssh me të njëjtat detaje të lidhjes si më parë. Ne po lidhemi si përdorues dave në një server të largët të quajtur fedora-36.local. Ne po përdorim gjithashtu opsionin -T (çaktivizoni ndarjen e pseudo-terminalit). Kjo parandalon që serveri në distancë të sigurojë një terminal interaktiv për këtë lidhje.

Ridrejtimi “<<” pasohet nga emri i një etikete. Në këtë shembull, ne po përdorim _remote_commands. Nuk ka asgjë të veçantë për këtë etiketë, është thjesht një etiketë.

Të gjitha komandat që shfaqen në rreshtat pas ridrejtimit dërgohen përmes lidhjes SSH. Ridrejtimi ndalon kur ndeshet etiketa. Ekzekutimi i skriptit pastaj vazhdon me rreshtin që ndjek etiketën.

Le të ekzekutojmë skriptin tonë të përzier të përpunimit lokal/në distancë.

./local3.sh

Siç pritej, ne shohim një hyrje të re në skedarin timestamp.txt.

cat timestamp.txt

Zgjeroni shtrirjen tuaj

Aftësia për të ekzekutuar skriptet nga distanca - të cilat janë shkruar, ruajtur dhe mirëmbajtur në nivel lokal - ofron një mjet të përshtatshëm administrimi. Duke ditur që saktësisht i njëjti version i një skripti funksionon në të gjithë serverët tuaj në distancë, e bën menaxhimin shumë më të lehtë.