web-dev-qa-db-ja.com

スクリプト内のSSH経由のTmux

リモートマシンとローカルマシンの両方で複数の長時間実行コマンドを生成するスクリプトを作成しようとしています。現在、私の解決策の例は次のとおりです。

#!/bin/bash

ssh -t [email protected] tmux new -s remote -d "find / *"

tmux new -s local -d "find / *"

ただし、これらのコマンドがより複雑になると(1つのfindコマンドではなく、引用符が含まれる長く連鎖したコマンド)、1行に配置して、ネストされた引用符をすべてエスケープするのは面倒になります。

いわゆる「ヒアドキュメント」でSSHを使用してみました。例:

ssh -t [email protected] << EOF
    tmux new -s remote -d "find / *"
EOF

tmux new -s local -d "find / *"

ただし、これにより、SSHの-Tまたは-tオプションでエラーnot a terminalが発生するか、-ttオプションを使用すると非常に奇妙な動作が発生します。

私のアプローチを最適化/劇的に変更するための提案はありますか?

1
Girmi

このアイデアこの他のアイデア を組み合わせて、次のようなものを機能させることができるはずです。

CMDS=$(cat <<CMD
read -e -p "Enter the path to the find: " FILEPATH
echo \$FILEPATH
#find \$FILEPATH -name $FILENAME
#read -p done: 
CMD
) 

tmux new -s Finder -n remote "ssh localhost -t '$CMDS'" \; \
        new-window -n local  "bash -c '$CMDS'" \; \
            attach \;

ボーナス-両方のコマンドが並行して実行され、同じtmuxセッションで実行されます。

実行するコマンドの複雑さによっては、引用とエスケープの問題が残る場合があります。また、read -p doneまたはコマンドが実行、終了し、tmuxも出力が表示されずに終了することに注意してください。おそらくそれはあなたが意図したことであり、findの使用は単なる例でした。

1
crimson-egret