Posts Tagged ‘ linux

Automatically start tmux

This guide describes how to setup tmux to automatically launch as part of a user’s shell environment. If you don’t have tmux installed, you can use a package manager or follow my guide to compiling tmux. In order to launch tmux with the user’s shell session, we need to add a line to that user’s .bashrc file.

This command will open the .bashrc script for the current user in vim for editing.

vim ~/.bashrc

Now add the follow lines to the user’s .bashrc.

if [ `which tmux 2> /dev/null` -a -z "$TMUX" ]; then
    tmux -2 attach || tmux -2 new; exit
fi

Now to break down what the above lines of code do:

if [ $TERM != "screen-256color" ] && [ $TERM != "screen" ];“, checks the $TERM environment variable to see if tmux is already running; in order to avoid an infinite loop of launching tmux.

tmux attach || tmux new; exit“, this launches tmux, launches tmux and attaches to any running session; if there are no sessions of tmux running then it creates a new one. exit, this closes the shell session running tmux when the last tmux window is closed.

Revisions

  • 2012-12-11: Rewritten for clarity.

tmux empty window name

After compiling the newest version of tmux 1.5, I started tmux only to discover that the window name was missing from all of the windows. So all of the windows looked like

0:* 1:-

They should look like

0:bash* 1:vim-

See how the name of the running command is missing in the first example.

After several hours of troubleshooting, I finally figured out the problem was with my user’s prompt string. There was an extra line being added to the front of the prompt string that was causing the problem. I figured this out by temporally creating a new user, so that I could test tmux with a clean user environment and then slowly moving files (e.g. .bashrc, etc…) from my environment to the test environment. I opened tmux after I moved each file until it broke. I then commented all of the lines in the problem file, commenting a line or function at a time until I found the problem line.

How to compiling tmux 1.5 for Ubuntu 10.04

Introduction

I’ve decide to tmux a serious try on my Ubuntu 10.04 server.

Dependencies

The first step is to install the dependencies, which are all conveniently available from the Ubuntu repositories.

This command will install the dependencies required to compile tmux from source code.

sudo apt-get install build-essential debhelper diffstat dpkg-dev fakeroot g++ g++-4.4 html2text intltool-debian libmail-sendmail-perl libncurses5-dev libstdc++6-4.4-dev libsys-hostname-long-perl po-debconf quilt xz-utils libevent-1.4-2 libevent-core-1.4-2 libevent-extra-1.4-2 libevent-dev

You may already have some of these dependencies installed, depending on if you have compiled applications from source code before.

Download

The next step is to download the source code for tmux. It can be found on SourceForge at

Extract

Now its time to extract the source code you just downloaded.

tar xvvf tmux-1.5.tar.gz

Compile

The next step is to configure and compile tmux.

This command will move into the new directory with the source code.

cd tmux/

This command will check for dependencies and configure the install. Setting --prefix will install tmux to /usr/bin, which is the same directory the package manager version of tmux installs too.

./configure --prefix=/usr

This command will make the tmux.

make

This command will install tmux to /usr/bin/tmux.

sudo make install

Conclusion Thats it, the last thing to do is start tmux.

This command will start tmux.

tmux

Automatically start screen

This guide describes how to setup screen to automatically launch as part of a user’s shell environment. If you don’t have tmux installed, you can use a package manager. In order to launch screen with the user’s shell session we need to add a few lines of code to that user’s .bashrc file.

This command will open the .bashrc script for the current user in vim for editing.

vim ~/.bashrc

Now add the follow lines to the user’s .bashrc.

if [ $TERM != "screen" ]; then
    screen -dR; exit
fi

Now to break down what the above lines of code do:

if [ $TERM != "screen" ];“, checks the $TERM environment variable to see if screen is already running; to avoid an infinite loop of launching screen.

screen -dR; exit“, launches screen attaching to any running screen sessions; if there are no sessions of screen running then it creates a new one. exit, this closes the shell running underneath screen when the last screen session is closed.

Revisions

  • 2011-05-23: Rewritten for clarity.
  • 2012-12-11: Rewritten for clarity.

Run multiple instances of OpenSSH on one server

Instruction

Why would you want to run multiple instances of OpenSSH on one server? One common answer is to have an internal and external instances of ssh. That was each one could have different configurations and security.

I’m using Ubuntu 10.04 for this guide, some things may be different on other distribution of Linux.

Binary

The first step is to create a symbolic link to sshd, which is located at /usr/sbin/sshd. By creating a symbolic link, sshd will automatically stay update when OpenSSH is update through aptitude.

The below command will create a symbolic link to sshd in the same directory as the original binary

sudo ls -s /usr/sbin/sshd /usr/sbin/sshd2

Configuration

The second step is to create a copy of the original configuration file, which is located at /etc/ssh/sshd_config. By creating a copy, we can set different options for each instances of sshd.

The below command will create a copy of the original sshd configuration file in the same directory.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd2_config

Now we need to edit the new configuration file so that the second instances of sshd runs on a different port from the original.

The below command will open the new sshd configuration file for editing in vi.

sudo vi /etc/ssh/sshd2_config

In order to make the new instances of sshd run on a different port, change the following line to the configuration file to reflect the line below (changes are marked in bold).

Port 2222

Initialization Script

The third step is to create a copy of the initialization script for sshd, which is located at “/etc/init.d/ssh”.

sudo cp /etc/init.d/ssh /etc/init.d/ssh2

Some modifications have to be made to the ssh initialization script in order to make it references and load the instances of sshd. Modify the new ssh initialization script to reflect the one below (changes marked in bold).

test -x /usr/sbin/sshd2 || exit 0
( /usr/sbin/sshd2 -\? 2>&1 | grep -q OpenSSH ) 2> /dev/null || exit 0

check_for_no_start() {
    if [ -e /etc/ssh/sshd2_not_to_be_run ]; then 
    if ! run_by_init; then
        log_action_msg "OpenBSD Secure Shell server not in use (/etc/ssh/sshd2_not_to_be_run)"
    fi
}

check_privsep_dir() {
    if [ ! -d /var/run/sshd2 ]; then
    mkdir /var/run/sshd2
    chmod 0755 /var/run/sshd2
    fi
}

check_config() {
    if [ ! -e /etc/ssh/sshd2_not_to_be_run ]; then
    /usr/sbin/sshd2 $SSHD_OPTS -t || exit 1
    fi
}

case "$1" in
  start)
    if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/sshd2.pid --exec /usr/sbin/sshd2 -- -f /etc/ssh/sshd2_config $SSHD_OPTS; then
        log_end_msg 0
    else
        log_end_msg 1
    fi
    ;;
  stop)
    if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/sshd2.pid; then
        log_end_msg 0
    else
        log_end_msg 1
    fi
    ;;

  reload|force-reload)
    if start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile /var/run/sshd2.pid --exec /usr/sbin/sshd2 -- -f /etc/ssh/sshd2_config; then
        log_end_msg 0
    else
        log_end_msg 1
    fi
    ;;

  restart)
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/sshd2.pid
    if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/sshd2.pid --exec /usr/sbin/sshd2 -- -f /etc/ssh/sshd2_config $SSHD_OPTS; then
        log_end_msg 0
    else
        log_end_msg 1
    fi
    ;;

  try-restart)
    start-stop-daemon --stop --quiet --retry 30 --pidfile /var/run/sshd2.pid
    case $RET in
        if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/sshd2.pid --exec /usr/sbin/sshd2 -- -f /etc/ssh/sshd2_config $SSHD_OPTS; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
    esac
    ;;

  status)
    status_of_proc -p /var/run/sshd2.pid /usr/sbin/sshd2 sshd2 && exit 0 || exit $?
    ;;

  *)
    log_action_msg "Usage: /etc/init.d/ssh2 {start|stop|reload|force-reload|restart|try-restart|status}"
    exit 1
esac

iptables

Now you need to make sure that you open a port in the firewall for the new instances of sshd.

This command will open port 2222 in iptables for inbound TCP traffic.

sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

Start

Now it is time to start the new instances of sshd

This command will run the new initialization script ssh2.

sudo /etc/init.d/ssh2 start

Conclusion

If everything was successful, you will have two running instances of sshd (sshd and sshd2). You can check this by looking at the running processes.

This command will show running processes that have “ssh” in their name.

ps -e | grep ssh

You should see “sshd” and “sshd2″ in the output of the above command. If you don’t, then double check that you didn’t miss a step. You might also want to check your log files.