5 ms·
Scripting tmux
- kohtatsu 7y agoDespite using tmux for years, even having written scripts for nested sessions that I use each day, I hadn't noticed the CLI was missing long options. Kind of crazy.
- Pete_D 7y agoThis is a common property of software with BSD-ish roots. For example, neither does OpenSSH's ssh.
- tony 7y agoI wrote libtmux (https://libtmux.git-pull.com https://libtmux.git-pull.com) as a way to control tmux via python objects. In the backend, it's all tmux CLI commands. tmuxp (https://tmuxp.git-pull.com https://tmuxp.git-pull.com), similar to tmuxinator, uses libtmux under the hood to build workspaces from a yaml/json file: https://github.com/tmux-python/tmuxp/blob/master/tmuxp/workspacebuilder.py https://github.com/tmux-python/tmuxp/blob/master/tmuxp/works... Despite that, I've found some people prefer just using plain tmux scripting (https://twitter.com/bitprophet/status/561356905843392514 https://twitter.com/bitprophet/status/561356905843392514). Aside: That's Jeff Forcier, creator of fabric (http://www.fabfile.org/ http://www.fabfile.org/) Through tmux's formats (http://man7.org/linux/man-pages/man1/tmux.1.html#FORMATS http://man7.org/linux/man-pages/man1/tmux.1.html#FORMATS), you can about any info you'd like on your workspace. An area I don't know about is -C (control mode). libtmux could technically use it to get live updates rather than inefficiently and possibly needlessly querying session/window/pane info to keep objects up to date. Apparently iterm2's tmux integration uses it.
- cheez 7y agoThis is awesome. I had to hack together some scripts to implement workspace building and tmuxp looks like it might have saved me a lot of headache!
- frankharv 7y agoI use Tmux for starting 4 Bhyve VM's on FreeBSD via rc.local. It really like it better than screen or daemon processes. Nice for large compiling jobs on remote machines too.
- ORioN63 7y agoHave been looking for a while, but does anyone know if there is there anything like which-key for tmux? which-key on vim has been great in making sure, I use new features, I add to my config file.
- 3xblah 7y agoThis comment was posted using tmux scripting, as follows: set -x send(){ tmux send "$@";} send 'links -no-connect https://news.ycombinator.com/login?goto=news' ; send c-m; sleep 2; send 3xblah c-m $HNPASSWORD c-m c-m c-m; sleep 2; send Escape; sleep 1; send V S; sleep 1; send 'scripting tmux' c-m Down Down Down Down Down Down c-m; send Escape; sleep 1; send V S; sleep 1; send 'add comment' c-m Up; send 'This comment was posted using tmux scripting, as follows: ' c-m; a=$(sed '5,18!d' $0); sleep 2; send "$a"; sleep 2; send c-m c-m Down c-m;
- atq2119 7y agoA tmux/HN quine, or at least something close to it. This deserves to go into some sort of hall of fame.
- GordonS 7y agoNice, I had no idea you could script tmux like that! Reminds me of "expect", which I've used to automate interactive SSH sessions with network devices.
- tyingq 7y agoReplacing the sleeps with calls to "tmux capture-pane" to parse the responses would be closer to expect.
- 3xblah 7y agoBrainless method I use to check the panel: case $1 in ""|-b|-E|-S|-t) tmux capturep $@ --; tmux showb $@ --; exec tmux dele --; esac Also there is a "-N repeat count" option for send-keys in newer versions of tmux.
- abcdef123xyz2 7y agocapture-pane has -p so you can pipe its output rather than letting it create a buffer you have to delete.
- tjoff 7y agoJust this night I was thinking if whether tmux scripting could be abused to get it to work like zmodem. Sending files from the system with the tmux session to whatever machine one had sshd into (and ideally the other direction as well). Anyone know of this or a better approach?
- tyingq 7y agoTmux has pipe-pane, and it has -I and -O to go both directions. It does require some gyrations to get around the fact that it logs everything (the command itself, terminal control, etc), and not just what's output by the command. Here's a quick and dirty example: a) Start a tmux session to a remote host b) On the local host, run this (assuming session 0): $ tmux pipe-pane -o -t0 "tail -n +2 | col -b | base64 -d > ~/output" $ tmux send-keys -t0 "base64 /some/file && read" Enter $ tmux pipe-pane -t0 $ tmux send-keys -t0 Enter You should now have ~/output on the local host, which is identical to /some/file on the remote.
- tjoff 7y agoThank you, that is great! Will certainly play around with that :)