Bashスクリプトがあります。
- 何かをしなさい
- リバースシェルを接続または開きます。
- 別のことをする
my-script
コンテンツ:
#!/usr/bin/env bash
# does 'some thing'
sudo /usr/bin/nsenter --setuid 1000 --setgid 1000 --net=/var/run/netns/ns-a -- socat file:$(tty),raw,echo=0 tcp:10.10.10.1:2222
# does 'another thing'
ターミナルでこのスクリプトを対話的に実行すると、停止し、ユーザー対話用のリモートシェルが提供されます。
ユースケースはスクリプトを持つことです。
- パイプ入力を許可する(例:HEREDOCスタイル)
- パイプ入力が提供されない場合は、対話型シェルが表示されます。
私ができることを望むのは、バッチファイル(パイプライン入力)だけでなく、インタラクティブにこのスクリプトを使用することです。
以下は私をパニックにさせます:
my-script <<EOCMDS
echo 1
echo 2
EOCMDS
2020/12/13 21:28:59 socat[28032] E exactly 2 addresses required (there are 4); use option "-h" for help
あなたが考えることができるソリューションに感謝します。
修正する:
これはリモートシェルの設定に関するものではありません。間違いを避けるために、リモートサーバーは接続時にバスシェルを提供する準備ができて設定され受信されます。この問題はクライアントにのみ関連しています。この質問には関係ありませんが、疑いをより明確にするために、リモートサーバーは実際にはネットワークネームスペースのみではなくローカルクライアントにすぎません。
答え1
まあ、それはそれほど些細なことではないことがわかりました。
ユーザーが入場すると
$ wgsh
wgsh@vultr /$
とパイプコマンド:
$ wgsh <<EOD
echo 1
echo 2
echo 3
EOD
簡単ではありませんが、できます。
解決策は、ローカルにsocat
リモートシェル(リバースシェル)を開くようにすることです。パイプされたコマンド入力が検出されるたびにバックグラウンドに移動します。最後に、各パイプラインコマンドは/dev/ptsN
リンクバックエンドに送信されますsocat
。
最初の問題は、socat
背景を試すたびに常に2つの追加パラメータがあると思うことです。シェルスクリプトから。文句を言う:
socat[3124] E exactly 2 addresses required (there are 4)
2番目の問題は、他の人にコマンドを実行するのは/dev/ptsN
簡単ではないということです。
したがって、解決策は2つの部分で構成されています。
tmux
バックグラウンド接続に使用されますsocat
。ttyecho
各パイプラインコマンドをバックグラウンドで送信するために使用されますsocat
。
ttyecho
はPratik Sinhaのカスタムユーティリティ、そしてその一つさびた箱。
このコマンドラインツールは機能的にttyecho
Ubuntuパッケージの一部と似ていますが、私が知っている限り、ツールの開発は中止され、最後のUbuntuパッケージは12.04用でした。writevt
console-tools
つまり、自分でコンパイルしてインストールする必要がある可能性が高くなりますttyecho
。
そしていくつかの追加のしわ - 常に存在していませんか?
新しいttyを開くにはtmux
root権限が必要です。実行できるようにするには:
sudo --validate
tmux ...
開始されたプロセスブロックパスワードがない場合は、以下を追加する必要があります/etc/sudoers.d/<user>
。
Defaults: <user> !tty_tickets
すべてが準備されたら、これが機能します(ttyecho
あなたのパスから)。
if [ -t 0 -a $# -eq 0 ]
then
## No piped commands.
## 1. Start interactive shell.
sudo /usr/bin/nsenter --setuid 1000 \
--setgid 1000 \
--net=/var/run/netns/nns-a \
-- \
socat file:$(tty),raw,echo=0 \
tcp:10.10.10.1:2222
else
## Piped commands.
## 1. Setup sudo --validate for new tty sessions:
# Add
# Defaults: <user> !tty_tickets
# to the file (chmod 440): /etc/sudoers.d/<user>
#
sudo --validate
## 2. Start a detached connection to remote shell.
#
tmux new-session \
-d \
-s a_session \
'sudo /usr/bin/nsenter --setuid 1000 --setgid 1000 --net=/var/run/netns/nns-a -- socat file:$(tty),raw,echo=0 tcp:10.10.10.1:2222'
## 3. Capture the socat process ID
#
SOCAT_PID=$(pgrep -u "root" socat)
## 4. Get the /dev/pts of the socat connection
#
DEV_PTS=$(tmux list-panes -t a_session -F '#{pane_tty}')
## 5. Consume all the piped commands
#
while read cmd
do
sudo /usr/bin/nsenter --setuid 1000 \
--setgid 1000 \
--net=/var/run/netns/nns-a \
-- \
ttyexec -n ${DEV_PTS} "${cmd}"
done
## 6. Exit, if not already done.
#
if pgrep -u "root" socat
then
sudo /usr/bin/nsenter --setuid 1000 \
--setgid 1000 \
--net=/var/run/netns/nns-a \
-- \
ttyexec -n ${DEV_PTS} "exit"
fi
fi
誰かに役立つことを願っています。
答え2
リバースシェルの場合:
sudo /usr/bin/nsenter --setuid 1000 --setgid 1000 --net=/var/run/netns/ns-a -- socat TCP4:10.10.10.1:2222 EXEC:/bin/bash
その後、バックグラウンドでスクリプトを実行します。
./my-script &
一方:
socat -d TCP4-LISTEN:2222 STDOUT
<commands to execute>