Is het mogelijk om een bash-script te schrijven, dat
- zou worden gestart vanaf machine A, inlogt op een andere machine B door ssh (beide machines A en B zouden Linux-machines zijn),
- kopieert enkele bestanden naar machine B
- voert een python-script uit op een bepaald python-script op deze machines.
- stuurt de resultaten terug naar machine A
- logt uit van machine B.
Is dit technisch mogelijk?
Antwoord
Natuurlijk is het te doen:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
en dat is het …
Maar er is één probleem: u wordt driemaal om een wachtwoord gevraagd. Om te voorkomen dat u ssh-sleutels genereert en gebruikers autoriseert met deze sleutels.
Om ssh te genereren sleutels draaien ssh-keygen -t rsa
, beantwoord vragen en kopieer publieke sleutel naar externe host (machine B) naar ~/.ssh/authorized_keys
bestand. Privésleutel moet worden opgeslagen in ~/.ssh/id_rsa
op lokale machine (A).
Opmerkingen
Answer
Ik kan alles doen in een enkele ssh
verbinding / sessie:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
Dit:
- Kopieën
local_src
totremote_dst
, - Voert
command
, - Kopieert
remote_src
naarlocal_dst
.
Maar als command
schrijft op stdout
, het resultaat staat ook in local_dst
. Als command
invoer leest van stdin
, zal het ontvangen en EOF
.
Answer
Hoewel je dit binnen een enkele ssh-sessie kunt doen, is het een beetje lastig om het kopiëren van bestanden te combineren met lopende opdrachten.
De gemakkelijkste manier om deze taak uit te voeren, is door afzonderlijke SSH-sessies uit te voeren voor de drie bewerkingen:
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
Dit vereist drie keer authenticatie bij machineB. de aanbevolen manier om meerdere keren authenticatie te voorkomen, is door gebruik te maken van de mogelijkheid om verbindingen te delen in moderne versies van OpenSSH: start voor eens en voor altijd een masterverbinding met B en laat SSH automatisch meeliften op die masterverbinding. Voeg ControlMaster auto
en een ControlPath
regel toe aan uw ~/.ssh/config
, start dan een master-verbinding op de achtergrond en voer vervolgens je taken uit.
ssh -fN machineB # start a master connection in the background # Subsequent connections will be slaves to the existing master connection rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
In plaats van scpo te gebruiken r rsync om bestanden te kopiëren, kan het gemakkelijker zijn om het externe bestandssysteem onder SSHFS te mounten. Dit zorgt trouwens voor het opzetten van een master-verbinding (ervan uitgaande dat je “je ~/.ssh/config
hebt ingesteld zoals hierboven aangegeven).
mkdir /net/machineB sshfs machineB: /net/machineB cp -Rp inputs /net/machineB/ ssh machibeB "some command -i inputs -o outputs" cp -Rp /net/machineB/outputs .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
enControlPath=/path/to/socketfile
, en start dan een ssh-verbinding met-f
om een achtergrond-ssh uit te voeren. Vertel alle volgende SSH-verbindingen om hetzelfde socketbestand te gebruiken.