Skip to content

Instantly share code, notes, and snippets.

@ryin
Last active October 2, 2024 14:23
Show Gist options
  • Save ryin/3106801 to your computer and use it in GitHub Desktop.
Save ryin/3106801 to your computer and use it in GitHub Desktop.
bash script for installing tmux without root access
#!/bin/bash
# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.
# exit on error
set -e
TMUX_VERSION=1.8
# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp
# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz http://sourceforge.net/projects/tmux/files/tmux/tmux-${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz/download
wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz
# extract files, configure, and compile
############
# libevent #
############
tar xvzf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..
############
# ncurses #
############
tar xvzf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/local
make
make install
cd ..
############
# tmux #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..
# cleanup
rm -rf $HOME/tmux_tmp
echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."
@junieroliva
Copy link

@smilesun run
export CPPFLAGS="-P"
before the script as per https://stackoverflow.com/a/37475223/130152

@dajuno
Copy link

dajuno commented Sep 20, 2017

I have trouble with configuring tmux: libevent is not found. Executing the above scripts gives:

...
checking for LIBEVENT... no
checking for library containing event_init... no
checking event.h usability... yes
checking event.h presence... no
configure: WARNING: event.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: event.h: proceeding with the compiler's result
checking for event.h... yes
configure: error: "libevent not found"

edit: the LDFLAGS was missing $HOME/local/lib64 for libevent. adding -L$HOME/local/lib64 to LDFLAGS in the tmux ./configure and make calls fixed this.

@eva-n27
Copy link

eva-n27 commented Oct 11, 2017

I use script of @yogeshpv, and it works now.
Thanks all of you.

@thinki
Copy link

thinki commented Oct 16, 2017

@smilesun
Compile error is caused by GCC Version equaling 5.X which is too higher.
https://dev.openwrt.org/ticket/19749

Modify ncurses source code as below:

--- a/meta/recipes-core/ncurses/ncurses.inc
+++ b/meta/recipes-core/ncurses/ncurses.inc
@@ -26,7 +26,7 @@ ENABLE_WIDEC ?= "true"
 # _GNU_SOURCE is required for widec stuff and is detected automatically
 # for target objects.  But it must be set manually for native and sdk
 # builds.
-BUILD_CPPFLAGS += "-D_GNU_SOURCE"
+BUILD_CPPFLAGS += "-D_GNU_SOURCE -P"

 # natives don't generally look in base_libdir
 base_libdir_class-native = "${libdir}"

@parth126
Copy link

Thanks a lot mate. You are a life saver.

@d3v-null
Copy link

d3v-null commented Feb 9, 2018

Hey there, I tried to run this but https://sourceforge.net/projects/tmux/files/tmux/tmux-1.8/tmux-1.8.tar.gz/download is 404'ing for me :(
And then when I search for tmux on SourceForge, the project doesn't exist: https://sourceforge.net/directory/os:linux/?q=tmux
Any ideas?
EDIT: Solution is in @ZhouYL0213 's comment

@mukahraman
Copy link

Just updated the links and it is working perfectly. Thanks a lot for saving a lot of my time!

@hmm34
Copy link

hmm34 commented Mar 29, 2018

I used the solution in @yogeshpv 's comment. It worked with only one modification: cd to new version of ncurses (as of right now it is ncurses-6.1). Thanks!

@congyh
Copy link

congyh commented Jun 12, 2018

Thank you so much!

@YoungForest
Copy link

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.5

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz 
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz 
wget http://invisible-island.net/datafiles/release/ncurses.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses.tar.gz
cd ncurses-6.1
./configure --prefix=$HOME/local
make
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

thanks @yogeshpv and @hmm34 's comments.

@musically-ut
Copy link

musically-ut commented Aug 16, 2018

The links to libevent and ncurses redirect and wget tries to save them with a different filename.

Have fixed them (i.e. hardcoded) to the correct filenames. Also, bumped tmux version from 2.5 to 2.7.

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.7

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz 
wget -O libevent-2.1.8-stable.tar.gz https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz 
wget -O ncurses.tar.gz http://invisible-island.net/datafiles/release/ncurses.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses.tar.gz
cd ncurses-6.1
./configure --prefix=$HOME/local
make
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

@danellecline
Copy link

Thanks @musically-ut . Your fixes worked for me.

@jdhao
Copy link

jdhao commented Oct 25, 2018

@musically-ut, I see that you put some include dir for LDFLAGS. AFAIK, the LDFLAGS are for library files, not header files. Is there anything that I am missing here? Or because Tmux is different in that it requires us to do so? It seems I can not find some official guide.

@abalhomaid
Copy link

@musically-ut script works. Thanks a lot!

@StevenShi-23
Copy link

To use the latest tmux release v2.8, the following works for me (notice you need to do autogen.sh before using ./configure, and use make -j can speed up the build process):

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.8

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/archive/${TMUX_VERSION}.tar.gz 
wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=$HOME/local --disable-shared
make -j
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/local
make -j
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./autogen.sh
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

@JoyHuYY1412
Copy link

Everything is right But when I runtmux
it says -bash: tmux: command not found
what can I do ?

@todeschini-felipe
Copy link

todeschini-felipe commented Jan 8, 2019

@StevenShi-23 script is breaking in
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make

with
make: *** No rule to make target 'compat/forkpty-linux.c', needed by 'compat/forkpty-linux.o'. Stop.

I am using CentOS 6.10. Any ideas?

@amlestin
Copy link

amlestin commented Jan 15, 2019

To use the latest tmux release v2.8, the following works for me (notice you need to do autogen.sh before using ./configure, and use make -j can speed up the build process):

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.8

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/archive/${TMUX_VERSION}.tar.gz 
wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=$HOME/local --disable-shared
make -j
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/local
make -j
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./autogen.sh
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

Thanks for the help. This worked for me on Red Hat Enterprise Linux Server release 6.9 (Santiago).

My ~/.bashrc also contains export PATH="$PATH:$HOME/local/bin" to make tmux accessible everywhere.

@hypan599
Copy link

Just updated links of latest tmux and it worked perfectly. Thanks!

@zeeshansayyed
Copy link

Thank you @mnsmar

@hoosierEE
Copy link

The above from @StevenShi-23 and @amlestin (including the part about adding to $PATH) worked for me on Centos 7.6. Thanks!

@acanakoglu
Copy link

I updated for 2.9a.


# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.9a
LIBEVENT_VERSION=2.1.8-stable
NCURSES_VERSION=6.1


# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download all the files
wget https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz
wget https://github.com/libevent/libevent/releases/download/release-${LIBEVENT_VERSION}/libevent-${LIBEVENT_VERSION}.tar.gz
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-${NCURSES_VERSION}.tar.gz

############
# libevent #
############
tar xvzf libevent-${LIBEVENT_VERSION}.tar.gz
cd libevent-${LIBEVENT_VERSION}
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses-${NCURSES_VERSION}.tar.gz
cd ncurses-${NCURSES_VERSION}
./configure --prefix=$HOME/local
make 
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

cd $HOME

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

# for the in order to add to the .bashrc (for /sh/bash) comment-in below line
# echo 'export PATH="$HOME/local/bin:$PATH"' >> $HOME/.bashrc

@flakrat
Copy link

flakrat commented Nov 4, 2019

Curious, why not use make install after compiling Tmux rather than cp tmux $HOME/local/bin?

Not a big difference, but you are missing the man page:

make[1]: Entering directory `/home/flakrat/sources/tmux-2.9a'
 /usr/bin/mkdir -p '/home/flakrat/local/bin'
  /usr/bin/install -c tmux '/home/flakrat/local/bin'
make  install-exec-hook
make[2]: Entering directory `/home/flakrat/sources/tmux-2.9a'
if test xmdoc = xmdoc; then \
	sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \
		>./tmux.1.mdoc; \
else \
	sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \
		gawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /home/flakrat/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \
	/home/flakrat/local/share/man/man1/tmux.1

@jrwrigh
Copy link

jrwrigh commented Mar 26, 2020

Note: The latest version of tmux (3.0a) is distributed as an Appimage. So you can simply download the Appimage and either:

  1. Put the Appimage somewhere on your path (and thus call tmux.Appimage directly) or
  2. Extract out the Appimage. This may be necessary depending on whether your machine can directly run Appimages.

@Derryxu
Copy link

Derryxu commented May 21, 2021

Thank you so much!

@Zemke
Copy link

Zemke commented May 29, 2021

For anyone looking to do this for Windows. Installing Tmux in Git Bash for instance without admin privileges.

You can grab the file from https://packages.msys2.org/package/tmux?repo=msys&variant=x86_64 and it contains tmux.exe along with appendices.

https://github.com/msys2/MSYS2-packages/blob/master/tmux/PKGBUILD is how they build it.

@nodswal
Copy link

nodswal commented Jan 24, 2022

Wow this is an older version of my build script, I will have to look through the commits for suggestions
https://github.com/nodswal/tmux-install

@davehouser1
Copy link

davehouser1 commented Nov 9, 2022

@StevenShi-23 script is breaking in CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make

with make: *** No rule to make target 'compat/forkpty-linux.c', needed by 'compat/forkpty-linux.o'. Stop.

I am using CentOS 6.10. Any ideas?

Any solution to this? I know CentOS6.10 is ancient but that is the version @StevenShi-23 and I are using. Is this only a problem on older distros? tmux refuses to to continue to compile with this error:

$ ./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include" CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib"
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/home/dh016d/tmux/packages_downloaded/tmux-2.2':
configure: error: C compiler cannot create executables
See `config.log' for more details

I can get past it if I just run

./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses -I$HOME/local/include/event2" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include -L$HOME/local/include/event2" CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses -I$HOME/local/include/event2"

However after I make tmux throws this error:

$tmux -V
./tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
$ldd ./tmux
        linux-vdso.so.1 =>  (0x00007ffca26e0000)
        libutil.so.1 => /lib64/libutil.so.1 (0x0000003b71e00000)
        libevent-2.0.so.5 => not found
        librt.so.1 => /lib64/librt.so.1 (0x0000003b68600000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003b69200000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003b67600000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b67e00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000561f0752f000)

configure refuses to link the library for libevent, I cant figure out why. Anyone know?

EDIT: Got it working, followed this post here.

Steps to fix. Do not compile the way the script as above, do the following after you untar tmux and go into the directory.

export DIR="$HOME/local"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR/lib
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
make
make install

One more note, all the posts about using autogen.sh, that did not work for me because aclocal was not installed. To avoid having to install autogen and autoconf I just downloaded the release version from here

https://github.com/tmux/tmux/releases/download/2.2/tmux-2.2.tar.gz

Change the version to what you want, like this. The configure script should be inside so you dont need to use autogen

https://github.com/tmux/tmux/releases/download/2.8/tmux-2.8.tar.gz

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment