#!/bin/bash # instant-rsyncd lets you quickly set up and start a simple, unprivileged rsync # daemon with a single module in the current directory. I've found it # invaluable for quick testing, and I use it when writing a list of commands # that people can paste into a terminal to reproduce a daemon-related bug. # Sysadmins deploying an rsync daemon for the first time may find it helpful as # a starting point. # # Usage: instant-rsyncd MODULE PORT RSYNCD-USERNAME [RSYNC-PATH] # The script asks for the rsyncd user's password twice on stdin, once to set it # and once to log in to test the daemon. # -- Matt McCutchen set -e dir="$(pwd)" echo echo "This will setup an rsync daemon in $dir" if [ $# = 0 ]; then IFS='' read -p 'Module name to create (or return to exit): ' module [ ! "$module" ] && exit else module="$1" shift fi if [ $# = 0 ]; then IFS='' read -p 'Port number the daemon should listen on [873]: ' port else port="$1" shift fi [ "$port" ] || port=873 if [ $# = 0 ]; then IFS='' read -p 'User name for authentication (empty for none): ' user else user="$1" shift fi if [ "$user" ]; then IFS='' read -s -p 'Desired password: ' password echo fi rsync="$1" [ "$rsync" ] || rsync=rsync moduledir="${dir%/}/$module" mkdir "$module" cat >rsyncd.conf <>rsyncd.conf <<-EOF auth users = $user secrets file = $module.secrets EOF touch "$module".secrets chmod go-rwx "$module".secrets echo "$user:$password" >"$module".secrets user="$user@" fi cat >start <stop <<"EOF" #!/bin/bash set -e cd `dirname $0` ! [ -e rsyncd.pid ] || kill -s SIGTERM $(< rsyncd.pid) EOF chmod +x stop path="rsync://$user$(hostname):$port/$module/" if ./start; then sleep .2 echo echo "I ran the start command for the daemon. The log file rsyncd.log says:" echo cat rsyncd.log echo echo "You can start and stop it with ./start and ./stop respectively." echo "You can customize the configuration file rsyncd.conf." echo echo "Give rsync the following path to access the module:" echo " $path" echo if [ "$user" ]; then echo "Let's test the daemon now. Enter the password you chose at the prompt." else echo "Let's test the daemon now." fi echo echo '$' $rsync --list-only "$path" $rsync --list-only "$path" echo echo "You should see an empty folder; it's $moduledir." else echo "Something went wrong. Do you see an error message?" fi