3 Strategies to Send Files to Multiple Linux Hosts in Emergencies

Written by levorak | Published 2020/10/05
Tech Story Tags: linux-and-unix | learn-linux-command | learn-linux | linux-tips | coding | software-development | ssh | linux

TLDR 3 Strategies to Send Files to Multiple Linux Hosts in Emergencies: In emergencies you need to send a file to multiple hosts and you can not do it manually. Below I talk you through three strategies you can use to send files in emergencies. From the server send the file to each host using SCP and expect to avoid entering the password many times. From each host download the file from the server using rsync. Then copy the content of the file_to_recover in the host and recover it.via the TL;DR App

Let's suppose you need to send a file to multiple hosts and you can not do it manually and you need to do it now. Below I talk you through three strategies you can use to send files in emergencies.

SCP + EXPECT

From the server send the file to each host using SCP and expect to avoid entering the password many times
#!/bin/bash

USER="user"
PASS="passwd"
DEST_PATH="/home/user"

list="192.168.0.1 
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
"

for i in $list;
do
 VAR=$(expect -c "
 spawn scp -oStrictHostKeyChecking=no -oCheckHostIP=no file.txt $USER@$i:$DEST_PATH
  match_max 100000
 expect \"*?assword:*\"
 send -- \"$PASS\r\"
 send -- \"\r\"
 expect eof
 ")
echo "$VAR" #to see remote command answer
done

rsycn + EXPECT

From each host download the file from the server using rsync and expect to avoid entering the password many times
#!/bin/bash

USER="user"
PASS="passwd"
DEST_PATH="/home/user"

list="192.168.0.1 
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
"

for i in $list;
do
 VAR=$(expect -c "
 spawn rsync -e \"ssh -o StrictHostKeyChecking=no\" file.txt $USER@$i:$DEST_PATH 
  match_max 100000
 expect \"*?assword:*\"
 send -- \"$PASS\r\"
 send -- \"\r\"
 expect eof
 ")
echo "$VAR"
done

Parallel-scp

Use the command parallel-scp to sent the file from the server to each host (hosts list on the ips.txt file one per line)
parallel-scp "-O StrictHostKeyChecking=no" --askpass -lremote_host_user -h ips.txt  file.txt /remote/host/dest/path

Bonus Tip

If you lose ssh connection to a server but you still have session active this trick could help you. ;)
Generate the file
#For files
base64 file_to_copy > file_to_recover

#For directories
base64 directory_to_copy.tar.gz > file_to_recover

#For RPMs
tar cfz - $(rpm -ql ssh) | base64 > file_to_recover
Then copy the content of the file_to_recover in the host and recover it with these commands
#For files
base64 -d file_to_recover

#For directories
base64 -d file_to_recover | tar xfz

#For RPM
base64 -d < file_to_recover | tar xfz -

Written by levorak | Colombian Engineer Cybersecurity, Opensource and BI enthusiast
Published by HackerNoon on 2020/10/05