如何通過 ssh 將字元串發送到伺服器上的腳本,並使用簡單的入獄使用者,並將伺服器上的結果保存在本地電腦上的文件中?
我將從本地機器發送一個字元串到遠端 ssh 伺服器。
使用者在一個簡單的監獄裡,所以他不能執行命令、登錄、在遠端 bash 上做一些事情,他只能發送一個字元串/值/變數並
run
在 ssh 伺服器上執行腳本。這是使用者的簡單監獄
這是 USER 登錄和執行 shell 的預設設置:
chsh -s /bin/bash [USER]
但是我將設置更改為這個簡單的監獄:
chsh -s /home/[USER]/./run [USER]
ssh 伺服器接收字元串並將字元串更改為新結果。
我將這個新結果保存在本地機器上一個名為
OUTPUT
.嘗試後我找到了這個解決方案,稱它為 hack 或 bug,但我不知道這是否是正確的方法!
- 使用此命令,我使用沒有密碼的 ssh 密鑰 ssh 到遠端伺服器。
我在本地機器上的 SSH 命令連接到伺服器:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
- 腳本從變數
run
接收字元串123``$VALUE
run
我在 SSH 伺服器上的名字腳本#!/bin/bash echo "WELCOME TO SSH" read VALUE echo $VALUE
這只是一個例子,看看我的意思,真正的腳本生成一個雜湊。
- 在我的本地機器上,我將遠端 ssh 伺服器
OUTPUT
腳本中的結果儲存/保存在我的文件中。run
我的本地文件
OUTPUT
與來自伺服器的結果WELCOME TO SSH 123
該
read VALUE
命令在沒有提示的情況下將值保存123
在變數中$VALUE
,並將結果保存在我的本地電腦上。執行步驟:
- 連接到 ssh 伺服器
- 從我的本地機器發送一個字元串到遠端 ssh 伺服器
- 遠端伺服器將此字元串更改為新結果
- 將本地電腦上的新結果保存在文件中
當我啟動 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
-c
和some 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=...
inauthorized_keys
. 這樣做還允許使用no-pty
關鍵字禁用 pty 分配。(並且僅執行與密鑰相關的強制命令這一事實可能會影響執行那些 PAM 會話模組。)請參閱 sshd手冊頁。