刑務所に閉じ込められた単純なユーザーを使用してSSHを介してサーバーのスクリプトに文字列を送信し、結果を自分のローカルコンピュータのサーバーからファイルに保存するにはどうすればよいですか?

刑務所に閉じ込められた単純なユーザーを使用してSSHを介してサーバーのスクリプトに文字列を送信し、結果を自分のローカルコンピュータのサーバーからファイルに保存するにはどうすればよいですか?

私のローカルコンピュータからリモートSSHサーバーに文字列を送信します。

ユーザーは単純な刑務所にいるので、コマンドの実行、ログイン、リモートbashでの操作、または他の操作を実行することはできませんrun

これはユーザーのための簡単な刑務所です。

これは、ユーザーがログインしてシェルを実行するためのデフォルト設定です。

chsh -s /bin/bash [USER]

しかし、単純刑務所の設定を次のように変更しました。

chsh -s /home/[USER]/./run [USER]

SSH サーバーは文字列を受け取り、その文字列を新しい結果に変更します。

この新しい結果を私のローカルコンピュータにOUTPUT

試した最後にこの解決策を見つけました。ハッキングやバグと呼んでいますが、これが正しい方法かどうかわかりません!

  1. このコマンドを使用すると、パスワードなしでSSHキーを使用してリモートサーバーにSSHとして接続できます。

私のローカルコンピュータのサーバーに接続するSSHコマンドは次のとおりです。

ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
  1. スクリプトは変数からrun文字列を受け取ります。123$VALUE

runSSHサーバーのマイスクリプト名

#!/bin/bash
echo "WELCOME TO SSH"
read VALUE
echo $VALUE

これは、実際のスクリプトがハッシュを生成するという意味を示す例に過ぎません。

  1. 私のローカルコンピュータは、OUTPUTリモートSSHサーバースクリプトの結果を自分のファイルに保存/保存します。run

私のローカルファイルOUTPUTとサーバーの結果

WELCOME TO SSH
123

このコマンドは、read VALUEメッセージを表示せずに123変数に値を保存$VALUEし、結果をローカルコンピュータに保存します。

ステップ:

  1. SSHサーバーに接続
  2. ローカルコンピュータからリモートSSHサーバーに文字列を送信する
  3. リモートサーバーはこの文字列を新しい結果に変更します。
  4. 新しい結果をローカルコンピュータのファイルに保存する

ssh コマンドを開始すると、接続が開きます。

スクリプトが機能し、WELCOME TO SSH端末で確認されます。

私のローカルコンピュータから結果を受信し、接続を閉じます。

この例をコンピュータで簡単にテストして、何を意味するのかを確認できます。

これは私に必要なものですが、次のことを知りたいです。

なぜ私に必要ですか?read

メッセージが受信されないのはなぜですか?

この例に対する他の解決策は何ですか?

刑務所に閉じ込められたユーザーを使用してSSHを介してサーバーのスクリプトに文字列を送信し、結果を自分のローカルコンピュータのサーバーにファイルとして保存するにはどうすればよいですか?

ソリューションの更新

@ilkkachuの回答で、次のコマンドを実行して送信できます。

文字列と変数:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123" "$VALUE" > OUTPUT

ひも:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123"> OUTPUT

変える:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] "$VALUE" > OUTPUT

何もありません:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] > OUTPUT

#!/bin/bash

value=     # empty by default
if [ "$1" = -c ]; then
    value="$2"
fi
if [ -z "$value" ]; then
    echo "value is empty" >&2
    exit 1
fi
# do something with the value
echo "$value" | rev 

SSHauthorized_keys コマンドオプション

この記事では:

SSHauthorized_keysコマンドオプション:複数のコマンドがありますか?

いいえ、これは「許可」コマンドではなく「強制」コマンド(ForceCommandオプション)です。唯一の可能性は、異なるコマンドに異なるキーを使用するか、標準入力から引数を読み取ることです。

これは良いヒントですが、バックアップや一部の情報出力などの単一のコマンドに適用されます。

rsync同様のコマンドを実行してもエラーが発生しないようにするには、追加の構成を実行する必要があります。

だから私は単純な刑務所に閉じ込められたユーザーと与えられたスクリプトを使い続けます。

答え1

使い方はssh user@somehost <<< "$value"ほぼ同じですecho "$value" | ssh user@somehost。変数の内容が SSH クライアントプロセスの標準入力に送信されます。 SSHはこれをリモート側に送信し、リモートプロセスは標準入力からそれを読み取ることができます。たとえば、readここで行ったようにシェルを使用します。これはSSH接続を介してデータを転送する方法です。

別の方法は、コマンドラインパラメータを使用することです。走れば

ssh user@somehost "some string here"

-cその後、SSHはリモート側に2つのパラメータを要求し、リモートユーザーのシェルを実行しますsome string here。とノーマルシェルを使用すると、シェルは「ここの一部の文字列」をシェルコマンドラインとして解釈してssh user@somehost "ls /tmp"実際に実行されますls。 (ssh user@somehost ls /tmp同じ操作を実行すると、SSHクライアントは引数をリモートに送信する前にスペースで連結します。)

ただし、ユーザーが実行できる操作を制限するためにユーザーのシェルを変更したため、この-cオプションはSSHによって想定される操作を実行しません。同じ理由でプロンプトはありません。スクリプトは通常のシェルのようにプロンプ​​トを印刷しません。

しかし、スクリプトがシェルかどうかは問題ではありません。スクリプトは、この-cオプションを検出して無視し、それに続く項目を使用できるためです。

たとえば、リモコンに次のスクリプトがあるとします。

#!/bin/bash

value=     # empty by default
if [ "$1" = -c ]; then
    value="$2"
fi
if [ -z "$value" ]; then
    echo "value is empty" >&2
    exit 1
fi
# do something with the value
echo "$value" | rev 

模擬例では、値を渡して文字列を反転しますrev

したがって、実行するとssh user@somehost "hello there"文字列が返されますereht olleh

ssh user@somehost最後に「コマンド」を入力せずに実行すると、スクリプトにエラーメッセージが表示されますが、SSHは対話型セッションを開始するかのように動作します。リモートで疑似端末(pty)を維持し、LinuxでPAMセッションモジュールを実行するなど、ログイン中に通常実行されるいくつかの追加タスクを実行できます。これらの機能は、「今日のメッセージ」を印刷したり、アカウントから未読の電子メールを確認したりするなどの操作を実行できます。と同じなssh user@somehost ""ので、実際に通過できません。パラメータを使用し、null以外のパラメータと同じように動作すると予想します。


リモートユーザーのシェルを制限することに加えて、SSHを介して実行できるコマンドをロックする別の代替方法は、SSHキーを使用してcommand=...inを使用することですauthorized_keys。これにより、no-ptyキーワードを使用してpty割り当てを無効にすることもできます。 (キー関連の強制コマンドを実行するだけで、これらのPAMセッションモジュールの実行に影響を与える可能性があります。)sshdを参照してください。マニュアルページ

答え2

私の考えでは、あなたが混乱していると思います。

あなたは何ですか最初は質問:
ローカル値がある場合(ローカルコンピュータなど)、リモートコンピュータに移動しなくてもVALUE="XXXXXXXX"その値をローカルファイルに保存できます。OUTPUT

あなたは何ですか実際に尋ねたいもの:
可能性1:私の考えにはリモート値(VALUE="XXXXXXXX"リモートシステムなど)が必要で、それをローカルファイルに保存する必要がありますOUTPUT

ソリューション1:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] 'echo ${VALUE}' > OUTPUT

注:二重引用符ではなく一重引用符です!

ここで、単一引用符はVALUEローカルシステムでは評価されず、リモートシステムでは評価されることを保証します。

あなたは何ですか実際に尋ねたいもの:
可能性2:「リモートシステムで実行されているスクリプトにVALUE値を送信したいのですが、それで新しい値が出力されます。その新しい値をローカルファイルOUTPUTで使用したい」

ソリューション2:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] /path/to/myscript "${VALUE}" > OUTPUT

注:一重引用符ではなく二重引用符です!

ここでは、コマンドライン引数を介してVALUEをスクリプトに渡します。 /path/to/myscript で $1 を介して値にアクセスできます。たとえば、次のようになります。

VALUE=$1  
echo " I got $1 which I am storing in the variable VALUE which now contains $VALUE "  
#### Process VALUE & Compute new value and echo it  

あなたは何ですか実際に尋ねたいもの:
可能性3:「ユーザーがログインし、事前定義されたスクリプト(/home/[USER]/./run)を実行してログアウトすることができるリモートコンピュータがあります。リモートコンピュータで実行されているスクリプトにVALUE値を送信すると、新しい値が出力されます。ローカルファイル出力の新しい値」

解決策3:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] MYVALUE "${VALUE}" > OUTPUT

注:一重引用符ではなく二重引用符です!

ここでは、コマンドラインパラメータを介して文字列 "MYVALUE"と変数VALUEの値をスクリプトに渡します。スクリプトでは、/home/[USER]/./run$ 1、$ 2、$ 2などを介してこれらのコマンドラインパラメータ値にアクセスできます。

#!/bin/bash
echo "WELCOME TO SSH"
echo " I got \$1 which $1 "  
echo " I got \$2 which $2 "  
echo " I got \$3 which $3 "  
echo " I got \$4 which $4 "  
echo " I got \$5 which $5 "  
echo " I got \$6 which $6 "  
echo " I got \$7 which $7 "  
echo " I got \$8 which $8 "  
echo " I got \$9 which $9 "  
#### echo " I got STRING MYVALUE in ${N} and the value VALUE in ${M} which I am storing in the remote variable VALUE "  
#### VALUE=${M}  
#### echo $($VALUE + $VALUE)  

ここでは、すべてのコマンドラインパラメータ値$ 1、$ 2、$ 3、$ 4、$ 5、$ 6、$ 7、$ 8、$ 9をエコーし​​て、どのエントリにSTRING MYVALUEがあり、どのエントリに変数VALUEの値があるかを確認します。
たとえば、$3 の値が正しい場合は、不要なecho行をすべて削除し、最後の 3 行のコメントを外した後、N&M を更新して正常に動作していることを確認します。

関連情報