通過 ssh 隧道按需執行本地 Python 腳本
我有一個本地(本地網路,位於 NAT 路由器和防火牆後面)Ubuntu 機器和一個可公開訪問的(Ubuntu)伺服器。我想啟動從本地機器到伺服器的連接,然後在伺服器上在本地機器上執行一個特定的 Python 腳本(沒有其他命令或腳本)。但問題是:我想在將來的任何時候執行那個 Python 腳本,有時在每次執行後執行多次。我的第一個想法是 SSH 隧道(在本地機器上執行):
ssh user@remoteserver -R 21000:127.0.0.1:8081
但這並沒有讓我得到任何東西。我的下一次嘗試是這裡的答案。但這會在連接時執行腳本,然後在執行後斷開連接。
最後,我的問題是:如何建立一個由本地機器發起到伺服器的安全連接,在該連接上我可以按需在本地機器上執行 Python 腳本,而不僅僅是 SSH 命令的連接時間?
(如果有什麼太令人困惑,請告訴我,我會重新表述問題的一部分)。
有幾個選項,從這個開始:
ssh -N -R 21000:127.0.0.1:22 user@remoteserver
這將為您的本地 SSH 伺服器創建一條隧道(假設它正在執行並在標準埠上偵聽
22
)。任何能夠localhost:21000
從 SSH 連接的人都remoteserver
將訪問您的 SSH 伺服器(因此他們應該ssh
用於連接)。如果他們設法進行身份驗證、登錄並獲得 shell,那麼通常他們將能夠執行命令,包括 Python 腳本。如果您想從外部訪問,請參閱我的這個答案
remoteserver
。使用本地 root 訪問權限,您可以對此進行調整:
- 您可以創建一個專用使用者並讓相關方以該使用者身份進行身份驗證。
- 您可以使用受限 shell 作為使用者的登錄 shell 來限制他們可以執行的操作。
- 您可以使使用者的登錄 shell 自動執行到您選擇的某個 python 腳本。
- 或者,您可以首先使腳本成為使用者的登錄 shell。
這種方法可能是最需要的,因為您的本地 SSH 伺服器將處理身份驗證。路人將無法執行該腳本。
注意客戶端使用 連接到隧道的方式
ssh
,以及使用的選項(-t
,-T
),確定是否在伺服器上為它們分配了一個 tty(即在這種情況下是在您的本地電腦上)。或者,您可以像在我的另一個答案中一樣使您的 Python 腳本可用。初始命令是:
# on your local machine socat TCP-LISTEN:50011,fork EXEC:'/path/to/script',stderr,pty,echo=0
(請參閱
man 1 socat
;您可能只想綁定到127.0.0.1
,使用該bind=
選項。)然後創建一個到本地埠的隧道
50011
:ssh -N -R 21000:127.0.0.1:50011 user@remoteserver
任何連接到
localhost:21000
的人都remoteserver
將無需身份驗證即可訪問您的腳本。例如,它們可以nc
用於連接。