chiark / gitweb /
hacks/ssh: Redirect the master's output and error.
[profile] / hacks / ssh
index a11c7773209df1d37d13e1d1121d914377dd13a2..16b75782352fb6e694e46da4d1c4b025d86871b8 100755 (executable)
--- a/hacks/ssh
+++ b/hacks/ssh
@@ -25,6 +25,8 @@
 ### Configuration.
 
 : ${REAL_SSH=/usr/bin/ssh}
+: ${SSH_HOME=$(unset HOME; bash -c 'echo ~/.ssh')}
+: ${SSH_LOGDIR=$SSH_HOME/log-$(hostname)}
 
 ###--------------------------------------------------------------------------
 ### Parse the command line and dredge out information.
@@ -113,6 +115,13 @@ while :; do
            login=$arg
            ;;
 
+         ## Catch the port number.  We want this for building the logfile
+         ## name.
+         ?,p*)
+           masteropts=("${masteropts[@]}" "-p$arg")
+           port=$arg
+           ;;
+
          ## These options are interesting to the master connection.
          m,[aADLlRSwxXv]*)
            masteropts=("${masteropts[@]}" "-${o:0:1}$arg")
@@ -162,8 +171,11 @@ case "$mode" in
     exec "$REAL_SSH" "${opts[@]}" ${host+"$host"} "$@"
     ;;
   m)
+    mkdir -p -m700 "$SSH_LOGDIR"
+    logfile=$SSH_LOGDIR/${login+"$login@"}"$host"${port+":$port"}.log
     if ! "$REAL_SSH" -Ocheck ${login+"$login@"}"$host" >/dev/null 2>&1; then
-      "$REAL_SSH" -MNf "${masteropts[@]}" "$host"
+      "$REAL_SSH" -MNf "${masteropts[@]}" "$host" \
+       </dev/null >/dev/null 2>$logfile
     fi
     exec "$REAL_SSH" ${opts[@]} "$host" "$@"
     ;;