Wednesday, April 25, 2012

SCP Agent Forward-dal

Felmerült a feladat, hogy SCP-zzek olyan gépre ahova csak SSH Agent Forward-dal lehet bejutni. (Igazábol egy SCB követelte meg a dolgot.)

A probléma az, hogy az SCP alapból nem továbbít SSH Agent-et. De szerencsére rátaláltam erre az írásra,  ami megadta a megoldást.

A probléma gyökere az, hogy az SCP amikor meghívja az SSH-t akkor alaból kikapcsolja az Agent továbbítást, és ezt nem lehet felülbírálni sem a ~/.ssh/config szerkesztésével, sem a -A parancssori opcióval.

Szerencsére van az SCP-nek egy -S opciója, ahol meg lehet adni, hogy milyen SSH binárist futtasson. Így ha írunk egy wrappert, ami kiszedi a default Agent Forward tiltást az SCP által az SSH-nak átadott opciókból akkor nyert ügyünk van. Mentsük el a következő 3 soros kis script-et valami néven, például ssh-wrapper, adjunk rá végrehajtási jogot

#!/usr/bin/perl

exec '/usr/bin/ssh', map {$_ eq '-oForwardAgent no' ? '-oForwardAgent yes' : $_} @ARGV;

majd ezek után az SCP-t futtassuk a következő módon

$ scp -S ./ssh-wrapper some-file my-server:

végül dőljünk hátra elégedetten!:)

Tuesday, April 3, 2012

Make parallel script in bash

I have a script what does thing as processing a file line-by-line. I modified this script to do parallel processing like follows:

#!/bin/bash

MAXJOBS=3

while read line; do
( echo "do thing with $line" ) &

while [ "`jobs -p | wc -l`" -ge "$MAXJOBS" ]; do
sleep 1;
done

done < input.txt

wait

It starts the sub processes and if the count is as great as MAXJOBS then waits. At the end of the script the wait waits all the remaining processes.

UPDATE: If you need som for example grepping before on the input you should use:


...
done < <(cat input.txt|grep '#')

wait

instead of

cat input.txt|grep '#'| while read line; do