Ssh

如何通過 ssh 將字元串發送到伺服器上的腳本,並使用簡單的入獄使用者,並將伺服器上的結果保存在本地電腦上的文件中?

  • July 13, 2022

我將從本地機器發送一個字元串到遠端 ssh 伺服器。

使用者在一個簡單的監獄裡,所以他不能執行命令、登錄、在遠端 bash 上做一些事情,他只能發送一個字元串/值/變數並run在 ssh 伺服器上執行腳本。

這是使用者的簡單監獄

這是 USER 登錄和執行 shell 的預設設置:

chsh -s /bin/bash [USER]

但是我將設置更改為這個簡單的監獄:

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

ssh 伺服器接收字元串並將字元串更改為新結果。

我將這個新結果保存在本地機器上一個名為OUTPUT.

嘗試後我找到了這個解決方案,稱它為 hack 或 bug,但我不知道這是否是正確的方法!

  1. 使用此命令,我使用沒有密碼的 ssh 密鑰 ssh 到遠端伺服器。

我在本地機器上的 SSH 命令連接到伺服器:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
  1. 腳本從變數run接收字元串123``$VALUE

run我在 SSH 伺服器上的名字腳本

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

這只是一個例子,看看我的意思,真正的腳本生成一個雜湊。

  1. 在我的本地機器上,我將遠端 ssh 伺服器OUTPUT腳本中的結果儲存/保存在我的文件中。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 

SSH authorized_keys 命令選項

從這篇文章:

SSH authorized_keys 命令選項:多個命令?

不,這不是“允許”命令,而是“強制”命令(作為 ForceCommand 選項)。唯一的可能性是對不同的命令使用不同的鍵或從標準輸入讀取參數。

這是一個很好的提示,但對於單個命令,例如備份或輸出一些資訊。

如果我執行類似的命令rsync,如果我不想收到錯誤,我必須做更多的配置。

所以我會和一個簡單的被監禁使用者和一個給定的腳本呆在一起。

使用與使用ssh user@somehost <<< "$value"幾乎相同echo "$value" | ssh user@somehost:將變數的內容髮送到 SSH 客戶端程序的標準輸入。SSH 將其傳輸到遠端端,遠端程序可以在此處再次在標準輸入上讀取它。例如使用 shell 的read,就像你在那裡做的那樣。這是通過 SSH 連接傳遞數據的一種方式。

另一種方法是使用命令行參數。如果你跑

ssh user@somehost "some string here"

然後 SSH 要求遠端端使用兩個參數執行遠端使用者的 shell-csome string here. 使用普通的外殼程序,外殼程序會將“此處的某些字元串”解釋為外殼程序命令行,因此確實ssh user@somehost "ls /tmp"可以執行ls. (ssh user@somehost ls /tmp同樣,SSH 客戶端在將 args 發送到遠端之前將它們與空格連接。)

但是您更改了使用者的 shell 以限制他們可以執行的操作,因此該-c選項不會執行 SSH 假定的操作。出於同樣的原因,沒有提示:您的腳本不會像普通 shell 那樣列印一個。

但是,將腳本作為外殼並不重要,因為它可以檢測並忽略該-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

執行 just ssh user@somehost,最後沒有“命令”,會觸發腳本中的錯誤消息,但它也會讓 SSH 像啟動互動式會話一樣執行。它會在遠端保留偽終端(pty),並且可能會執行一些通常在登錄期間完成的額外內容,例如在 Linux 上執行 PAM 會話模組。那些做諸如列印“每日消息”或檢查帳戶是否有未讀電子郵件之類的事情。與 相同ssh user@somehost "",因此您不能真正傳遞一個參數並期望它的行為與非空參數完全相同。


除了限制遠端使用者的 shell,另一種鎖定可以通過 SSH 執行的命令的方法是使用 SSH 密鑰,並使用command=...in authorized_keys. 這樣做還允許使用no-pty關鍵字禁用 pty 分配。(並且僅執行與密鑰相關的強制命令這一事實可能會影響執行那些 PAM 會話模組。)請參閱 sshd手冊頁

引用自:https://unix.stackexchange.com/questions/709601