複数のコマンドをパイプして、リバースシェル(ネットワークネームスペース)をsocatします。

複数のコマンドをパイプして、リバースシェル(ネットワークネームスペース)をsocatします。

Bashスクリプトがあります。

  1. 何かをしなさい
  2. リバースシェルを接続または開きます。
  3. 別のことをする

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つの部分で構成されています。

  1. tmuxバックグラウンド接続に使用されますsocat
  2. ttyecho各パイプラインコマンドをバックグラウンドで送信するために使用されますsocat

ttyechoPratik Sinhaのカスタムユーティリティ、そしてその一つさびた箱

このコマンドラインツールは機能的にttyechoUbuntuパッケージの一部と似ていますが、私が知っている限り、ツールの開発は中止され、最後のUbuntuパッケージは12.04用でした。writevtconsole-tools

つまり、自分でコンパイルしてインストールする必要がある可能性が高くなりますttyecho

そしていくつかの追加のしわ - 常に存在していませんか?

新しいttyを開くにはtmuxroot権限が必要です。実行できるようにするには:

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

誰かに役立つことを願っています。

おすすめ記事