Är det möjligt att skriva ett bash-skript, att
- skulle startas från maskin A, loggar in på en annan maskin B av ssh (båda maskinerna A och B skulle vara Linux-maskiner),
- kopierar några filer till maskin B
- kör ett pythonscript ett givet pythonscript på dessa maskiner.
- överför resultaten till maskin A
- loggar av från maskin B.
Är detta tekniskt genomförbart?
Svar
Naturligtvis är det möjligt:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
och det är det …
Men det finns ett problem: du kommer att bli ombedd att ange lösenord tre gånger. För att undvika att du kan skapa ssh-nycklar och auktorisera användare med dessa nycklar. nycklar kör ssh-keygen -t rsa
, svara på frågor och kopiera offentlig nyckel till fjärrvärd (maskin B) till ~/.ssh/authorized_keys
-fil. Den privata nyckeln bör sparas i ~/.ssh/id_rsa
på lokal maskin (A).
Kommentarer
Svar
Jag kan göra allt i en enda ssh
anslutning / session:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
Detta:
- Kopior
local_src
tillremote_dst
, - Utför
command
, - Kopierar
remote_src
tilllocal_dst
.
Men om command
skriver på stdout
, resultatet blir också i local_dst
. Om command
läser inmatning från stdin
, kommer den att ta emot och EOF
.
Svar
Medan du kan göra detta i en enda ssh-session är det lite knepigt att kombinera kopieringsfiler med körande kommandon.
Det enklaste sättet att hantera denna uppgift är att köra separata SSH-sessioner för de tre operationerna:
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
Detta kräver autentisering till maskinB tre gånger. rekommenderat sätt att undvika autentisering flera gånger är att använda anslutningsdelningsfaciliteten i moderna versioner av OpenSSH: starta en huvudanslutning till B en gång för alla och låt SSH automatiskt köra tillbaka till den här huvudanslutningen. Lägg till ControlMaster auto
och en ControlPath
rad till din ~/.ssh/config
, starta sedan en huvudanslutning i bakgrunden och utför sedan dina uppgifter.
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/
I stället för att använda scp o r rsync för att kopiera filer kan det vara lättare att montera fjärrfilsystemet under SSHFS . Detta tar hand om att skapa en huvudanslutning förresten (förutsatt att du ”har ställt in din ~/.ssh/config
som anges ovan).
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
ochControlPath=/path/to/socketfile
och starta sedan en ssh-anslutning med-f
för att köra en bakgrundsssh. Be alla efterföljande SSH-anslutningar att använda samma uttagsfil.