Den konstigt namngivna "här dokument" låter dig använda inmatning / ut omdirigering inuti bash-skript på Linux. De är ett bra sätt att automatisera kommandon du behöver köra på en fjärrdator.
Här dokument
Många kommandon i Linux har två eller tre bokstäver. Detta är delvis vad som ger upphov till tanken att Linux är svårt att lära sig och full av Arcane-kommandon. Men ett av de konstigaste namnen i Linux är inte en av de kryptiskt korta. "Här dokument" är inte dokument, och det är inte riktigt klart vad "här" avser heller.
De är en relativt obskyra konstruktion, men de är användbara. Naturligtvis är det här Linux, så det finns mer än ett sätt att skinka en katt. En del av funktionaliteten som tillhandahålls av här dokument kan reproduceras på andra sätt. De alternativa metoderna är vanligtvis mer komplicerade. I programmering och skript betyder "mer komplicerat" också "mer benägna att buggar", och att din kod är svårare att behålla.
Var här dokument verkligen Excel är i automatisering av kommandon som du vill skicka till en fjärrdator från en anslutning som är etablerad från ett skript. Att göra anslutningen är lätt, men när anslutningen har gjorts, hur "pumpar du" dina kommandon från ditt skript i skalet på fjärrdatorn? Här kan du göra det enkelt.
Grundläggande principer för här dokument
Den idiomatiska representationen av ett här dokument ser ut så här:
Command & LT; & LT; Limit_String . . text data variabler . . Limit_String
-
KOMMANDO
: Detta kan vara något Linux-kommando som accepterar omdirigerad ingång. Notera
ekokommando accepterar inte omdirigerad inmatning . Om du behöver skriva till skärmen kan du användakattkommando, vilket gör . - & lt; & lt; : Omdirigeringsoperatören.
- Limit_String : Detta är en etikett. Det kan vara vad du än gillar så länge det inte visas i listan över data som du omdirigerar i kommandot. Den används för att markera slutet av listan över text, data och variabler.
- Datalista : En lista över data som ska matas till kommandot. Det kan innehålla kommandon, text och variabler. Innehållet i datalistan matas in i kommandot en rad i taget tills _limit_string uppstår.
Du kommer förmodligen att se exempel på här dokument som använder "EOF" som gränssträng. Vi gynnar inte det tillvägagångssättet. Det fungerar, men "EOF" betyder "slutet på filen." Bortsett från det sällsynta fallet där ett hemdokument är det sista i en skriptfil, används "EOF" felaktigt.
Det kommer att göra dina skript mycket mer läsbara om du använder en gränssträng som hänvisar till vad du gör. Om du skickar en serie kommandon till en fjärrdator över
Säkert skal
(SSH), en gränssträng kallad något som "_Remote_commands" skulle göra perfekt mening. Du behöver inte starta dem med en understrykning "
_
" karaktär. Vi gör det eftersom det markerar dem som något vanligt i ditt skript.
Enkla exempel
Du kan använda här dokument på kommandoraden och i skript. När du skriver följande i ett terminalfönster ser du en "
& gt;
"Linje fortsättningsprompten varje gång du slår" Enter. " När du skriver "_End_of_text" -gränssträngen och trycker på "Enter", skickas "listan över webbplatser till
katt,
och de visas i terminalfönstret.
Cat & Lt; & lt; _End_of_text How-to Geek Granska geek Lifesavvy Cloudsavvy det Minne _End_of_text
Det är inte det mest värda övningarna, men det visar att ingenting skickas till kommandot tills hela listan med data samlas och gränssträngen uppstår. De
katt
Kommandot mottar inte någon ingång tills du anger gränssträngen "_End_of_text" och tryck på "Enter" -knappen.
Vi kan göra samma sak i ett manus. Skriv eller kopiera det här exemplet till en redigerare, spara filen som "Heredoc-1.sh" och stäng redaktören.
#! / Bin / bash katt & lt; & lt; "_End_of_text" Ditt användarnamn är: $ (Whoami) Din nuvarande arbetskatalog är: $ pwd Din Bash-version är: $ BASH_VERSION _End_of_text
När du följer den här artikeln måste du varje gång du skapar ett skript
göra det körbart
innan det kommer att springa. I varje fall,
Använd
chmod
kommando
. Byt namn på skriptet i varje exempel för det skriptnamn som används här.
Chmod + x Heredoc-1.sh
Detta skript innehåller två miljövariabler,
$ Pwd
och
$ Bash_version
. De miljövariabla namnen ersätts med deras datavärden - den aktuella arbetskatalogen och versionen av Bash-när skriptet utförs.
Skriptet använder också
Kommandoutbyte
på
de
vem är jag
kommando
. Kommandot namn ersätts med egen produktion. Utgången från hela skriptet är skrivet till terminalfönstret med CAT-kommandot. Vi kör skriptet genom att ringa det med namn:
. / Heredoc-1.sh
Om du ändrar skriptet och lindrar gränssträngen i den första raden i det här dokumentet i citattecken "
"
"Datalistan skickas till det här dokumentkommandot ordentligt. Variabelnamn visas istället för variabla värden, och kommandosutbytet kommer inte att äga rum.
#! / Bin / bash Cat & LT; & LT; - "_End_of_text" Ditt användarnamn är: $ (Whoami) Din nuvarande arbetskatalog är: $ pwd Din Bash-version är: $ BASH_VERSION _End_of_text
Hantering Tab-tecken
Som standard kommer flikstecken i din datalista att behållas och skrivas till terminalfönstret. Kopiera och spara det här exemplet som "Heredoc-2.sh". Gör det körbart med hjälp av
chmod
kommando. Redigera de indragna linjerna för att se till att de har en eller två flikstecken i början av linjen istället för en serie mellanslag.
#! / Bin / bash
katt & lt; & lt; _End_of_text
Ditt användarnamn är: $ (Whoami)
Din nuvarande arbetskatalog är: $ pwd
Din Bash-version är: $ BASH_VERSION
_End_of_text
. / Heredoc-2.sh
Flikarna är skrivna till terminalfönstret.
Genom att lägga till ett streck "
-
"Till omdirigeringsoperatören kommer det här dokumentet att ignorera ledande flikstecken. Spara det här exemplet som "Heredoc-3.sh" och gör det körbart.
#! / Bin / bash
Cat & LT; & LT; - _End_of_text
Ditt användarnamn är: $ (Whoami)
Din nuvarande arbetskatalog är: $ pwd
Din Bash-version är: $ BASH_VERSION
_End_of_text
. / Heredoc-3.sh
Flikarna ignoreras. Det kan tyckas trivialt, men det är ett snyggt sätt att klara av ledande flikar på grund av indragna delar av skript.
Loops och andra logiska konstruktioner är vanligtvis indragna. Om ditt här dokument finns i en indragad del av ett skript med hjälp av ett streck "
-
"Med omdirigeringsoperatören tar bort formatering av problem som orsakas av de ledande flikstyperna.
#! / Bin / bash om sant; sedan Cat & Lt; & lt; - _limit_string Linje 1 med en ledande flik. Linje 2 med en ledande flik. Linje 3 med en ledande flik. _limit_string fi
Omdirigera till en fil
Utmatningen från kommandot som används med här dokumentet kan omdirigeras till en fil. Använd "
& gt;
"(Skapa filen) eller"
& gt; & gt;
"(Skapa filen om den inte existerar, lägg till filen om den gör) omdirigeringsoperatörer
efter
Gränssträngen i den första raden i här dokumentet.
Detta skript är "Heredoc-4.sh." Det kommer att omdirigera sin utgång till en textfil som heter "session.txt."
#! / Bin / bash katt & lt; & lt; _End_of_text & gt; session.txt Ditt användarnamn är: $ (Whoami) Din nuvarande arbetskatalog är: $ pwd Din Bash-version är: $ BASH_VERSION _End_of_text
. / Heredoc-4.sh
Cat Session.Text
Rör utmatningen till ett annat kommando
Utgången från kommandot som används i ett här dokument kan pipas som ingång till ett annat kommando. Använda sig av
röret "
H
"Operatör
efter
Gränssträngen i den första raden i här dokumentet. Vi ska pipa utmatningen från kommandot här,
katt
, in i
sed
. Vi vill
ersätta alla händelser
av bokstaven ”a” med bokstaven ”e”.
Namnge detta script ”heredoc-5.sh.”
#! / Bin / bash katt & lt; & lt; _end_of_text | sed 's / a / e / g' Hur Till Gaak _End_of_text
./ heredoc-5.sh
”Gaak” korrigeras till ”Geek”.
Sända parametrar till en funktion
Kommandot som används med en här dokumentet kan vara en funktion i skriptet.
Detta skript passerar vissa fordonsdata till en funktion. Funktionen läser data som om det hade skrivits in av en användare. Värdena för variablerna sedan ut. Spara skriptet som ”heredoc-6.sh”.
#! / Bin / bash
# de set_car_details funktion ()
set_car_details ()
{
Läs make
Läs modell
läs new_used
Läs delivery_collect
Läs plats
Läs pris
}
# Det här dokumentet som passerar data till set_car_details ()
set_car_details & lt; & lt; _mars_rover_data
NASA
uthållighet Rover
Begagnade
Samla
Mars (lång, lat) 77.451865,18.445161
2,2 miljarder
_mars_rover_data
# Hämta fordonsuppgifter
echo "Make: $ make"
echo "Modell: $ model"
echo "ny eller begagnad: $ new_used"
echo "leverans eller Collection: $ delivery_collect"
echo "Plats: $ location"
echo "Pris \ $: $ price"
./ heredoc-6.sh
Fordons detaljer skrivs till terminalfönstret.
Skapa och skicka e-post
Vi kan använda en här dokumentet för att skriva och skicka ett e-postmeddelande. Observera att vi kan skicka parametrar till kommandot framför omdirigering operatören. vi är
med hjälp av Linux
post
kommando
till
skicka ett e-post via det lokala postsystemet
till användarkontot som kallas ”Dave”. De
-s
(Ämne) option ger oss möjlighet att ange ämne för e-postmeddelandet.
Detta exempel formulär script ”heredoc-7.sh.”
#! / Bin / bash artikeln = "Här Documents" mail -s arbetsbörda status Dave & lt; & lt; _projekt rapport Användarnamn: $ (whoami) Har avslutat uppdrag: Artikel: $ artikeln _project_report
./ heredoc-7.sh
Det finns ingen synlig utdata från skriptet. Men när vi kontrollera vår e-post, ser vi att e-postmeddelandet var sammansatt, skickas och levereras.
post
Använda Här Dokument med SSH
Här dokument är ett kraftfullt och bekvämt sätt att utföra vissa kommandon på en fjärrdator när en SSH-anslutning har upprättats. Om du har ställt in SSH-nycklar mellan två datorer, kommer inloggningsprocessen vara helautomatiskt. I denna snabba och smutsiga exempel, kommer du att bli tillfrågad om lösenordet för användarkontot på fjärrdatorn.
Detta skript är ”heredoc-8.sh”. Vi kommer att ansluta till en fjärrdator som kallas ”remote-pc”. Användarkontot kallas ”Dave”. Vi använder
-T
(Inaktivera pseudo-terminal tilldelning) alternativet eftersom vi inte behöver en interaktiv pseudo-terminal tilldelas oss.
I ”göra en del arbete här” i skriptet kan vi passera en lista med kommandon, och dessa skulle utföras på fjärrdatorn. Naturligtvis kan du bara ringa ett skript som var på fjärrdatorn. Fjärr script kunde hålla alla kommandon och rutiner som du vill ha utfört.
Allt som vårt skript-heredoc-8.sh-kommer att göra är att uppdatera en anslutningslogg på fjärrdatorn. Användarkontot och en tid och datumstämpel loggas till en textfil.
#! / Bin / bash ssh -T [email protected] & lt; & lt; _remote_commands # Göra en del arbete här # Update anslutning log echo $ USER "-" $ (datum) & gt; & gt; /home/dave/conn_log/script.log _remote_commands
När vi kör kommandot, vi tillfrågas om lösenordet för kontot på avlägsen dator.
./ heredoc-8.sh
Viss information om fjärrdatorn visas och vi återvände till kommandotolken.
På
avlägsen
dator, kan vi använda
katt
att kontrollera anslutningsloggen:
katt conn_log / script.log
Varje anslutning visas för oss.
RELATERAD: Så här skapar du och installerar SSH-nycklar från Linux-skalet
Konstigt namn, snygga finesser
Här är dokumenten quirky men kraftfulla, speciellt när de används för att skicka kommandon till en fjärrdator. Det skulle vara en enkel sak att skript en backup rutin med
rsync
. Skriptet kan sedan ansluta till fjärrdatorn, kontrollera det återstående lagringsutrymmet och skicka ett varningsmeddelande om utrymme blev lågt.
RELATERAD: Så här säkerhetskopierar du ditt Linux-system med rsync