Skip to content

Instantly share code, notes, and snippets.

@mariusae
Created October 4, 2010 22:10
Show Gist options
  • Save mariusae/610551 to your computer and use it in GitHub Desktop.
Save mariusae/610551 to your computer and use it in GitHub Desktop.
#!/bin/sh
# $ sshm /fifo/directory host1 host2 host3...
# $ sshm -k /fifo/directory
# $ sshm /fifo/directory -c "ls"
# XXX - extra ssh flags
# set -- $(getopt kc "$@")
# while [ $# -gt 0 ]; do
# case "$1" in
# -k) kill=yep;;
# -c)
# # TODO
# ;;
# --) shift; break;;
# esac
# shift
# done
dir=$(mktemp -d /tmp/sshm.XXXXX)
ident_of_host() {
echo $host | md5 | sed -e 's/\(........\).*/\1/'
}
for host in "$@"; do
FIFO=${dir}/$(ident_of_host $host).in
FILE=${dir}/$(ident_of_host $host).out
mkfifo $FIFO
(
(while true; do
line=$(cat $FIFO)
if [ "$line" = "exit" ]; then
exit 1
else
echo $line
fi
done) | \
ssh -oStrictHostKeyChecking=no $host "sh" | \
(while read line; do echo "$host $line"; done)
) &
done
mass_murder() {
echo "killing!"
for host in "$@"; do
echo "exit" > ${dir}/$(ident_of_host $host).in
done
exit 0
}
trap mass_murder SIGINT
while read line; do
for host in "$@"; do
FIFO=${dir}/$(ident_of_host $host).in
echo $line > $FIFO
done
if [ "$line" = "exit" ]; then
break
fi
done
mass_murder
# rm -fr $dir
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment