KSH vi mode (auto complete)

Daily, I log into unix servers where the only installed shell is KSH.
I really miss the the auto-completion provided by the ‘tab’ key of BASH shells.

Something similar can be activated on KSH, by setting it to to the so called ‘VI’ mode.

set -o vi

in your .profile or .login scripts.
You can now enjoy the vi editor commands (and more) right from the command prompt.

To envoke the editor, simply hit the ESC key. Just like going from input mode to command mode inside of vi. Some of the more useful key strokes:

ESC+\ = autocomplete, will complete upto the non-unique character.
ESC+* = space delimited list of all files that match the pattern you started with.
ESC+/str = search the commandline history for str.
ESC+n = search for the next occurance of str.
ESC+k = go back one in the commandline history.
ESC+j = go forward one in the commandline history.
ESC+$ = go to the end of the current line
ESC+0 = go to the beginning of the current line
ESC+i = return to insert mode
ESC+A = append to the end of the current line
ESC+I = insert from the beginning of the current line
ESC+fx = move cursor to the right until the next occurance of x
ESC+Fx = move cursor to the left until the next occurance of x
ESC+x = delete character under cursor and place it in the buffer
ESC+p = place the contents of the buffer after the cursor
(combining the last two keystrokes)
ESC+xp = transpose two characters (I use this alot)

Allow connection sshd from other hosts

I set up an SSH server using Cygwin on windows. I was able to test it localy (ssh myAccount@localhost) but I encountered an error when trying from a distant machine.

ssh_exchange_identification: Connection closed by remote host

We have to allow connection from a distant machine inside /etc/hosts.allow on the server.
The syntax of this file is

<services separated by coma>:<hosts or IP separated by coma>[:command]

where command is the command to execute on a connection attempt

So I remove the PARANOID deny from the allow file (!?) and explicitly logged connection attempts from ssh.

# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
ALL : localhost 127.0.0.1/32 [::1]/128 : allow
ALL : PARANOID : deny
sshd: ALL
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
ALL : localhost 127.0.0.1/32 [::1]/128 : allow
# sshd: ALL
# same directive while keeping track of attemps
shd: ALL: spawn (echo "Attempt from %h %a to %d at `date` by %u" | tee -a /var/log/sshd.log)

Ultimate find…

You have got a directory and subdirectories full of jar/zip files and you would like to know which one contains the requested “Message” class … and avoid decompiling everything…

for i in `find . -name "*.jar"; find . -name "*.zip"`;
  do r=`jar -tvf $i | grep "Message"`;
    if [ "$r" != "" ]; then echo "Class found in $i";
    else echo "Not found in $i";
    fi;
  done

Thank you Gabriel…

Find and move old files

A very simple script to find all files modified within the 60 last days and move them to a specific directory.

find . -type f -mtime -60 | xargs -i  cp {} /tmp/archiveCopy/

Note the sign in front of 60. Without it, we would only retrieve the files modified 60 day ago. We could use + to retrieve files modified before this date.