Shell

將 ssh 輸出重定向到文件更改行結尾

  • May 19, 2022

首先,如果我做一個簡單的,ssh admin@example.com "cat backup.tar" > backup.tar這不會發生!所以,還有其他東西在轉換它,我不知道。

我需要在不授予伺服器訪問權限的情況下提供系統目前狀態的備份。我所做的如下:

  1. 創建一個新使用者。我們叫他吧username
  2. 只允許通過 ssh-key 訪問
  3. 將鑰匙放入authorized-keys
  4. 將命令/外殼更改/etc/passwd為自定義腳本username
  5. 自定義腳本通過執行數據庫轉儲並複制一些文件來獲取數據,並最終創建一個 tar 存檔到stdout
  6. 確保沒有額外的輸出到stdout.

要獲取您需要做的數據:ssh username@example.com > backup.tar.

現在,除了行尾發生了變化之外,幾乎一切都執行良好。變大tar了,我可以看到每一行都有以^M符號結尾的 dos 行。如果我強制dos2unix二進制 tar 文件,該文件與伺服器上的文件匹配。

為什麼會發生這種情況以及是什麼改變了行尾?我什至將其簡化為以下內容:伺服器上用於username連結的腳本/etc/passwd只是 make a並且當使用上述命令登錄並將輸出重定向到我本地電腦上的文件cat .viminfo時,行結尾仍然傳輸錯誤。ssh``username

可能發生的情況:在ssh沒有命令參數(也沒有指定選項)的情況下呼叫時,預設情況下會在遠端系統上為會話分配RemoteCommand一個偽終端。無論遠端系統配置為執行什麼命令,都會發生這種情況。偽終端通常配置為將換行字元轉換為輸入 + 換行序列(LFCRLF,請參閱此答案以獲得詳細說明)。因此,您的腳本的輸出被寫入一個偽終端設備,該設備對其進行更改,然後發送到客戶端。

可以通過多種方式防止分配偽終端,包括:

  • 在客戶端使用選項呼叫(或ssh在的配置文件中使用(可能));-T``RequestTTY no``ssh``~/.ssh/config
  • no-pty (注意空格)添加到authorized_keys遠端系統上的使用者鍵中;
  • PermitTTY no在遠端系統上的 SSH 伺服器的配置中使用(可能/etc/ssh/sshd_config),可能使用Match條件塊使其僅影響特定使用者);例如:
Match User="username"
 ForceCommand /path/to/your/script
 DisableForwarding yes
 PermitTTY no

(假設為使用者設置了一個工作命令解釋器/etc/passwd;然後您可能想要鎖定使用者的密碼並確保他們沒有其他登錄方式);

  • (在您的情況下,ssh使用命令參數呼叫也應該有效(例如ssh user@host :);儘管我認為這只不過是一種解決方法)。

當然,最合適的選項取決於您的案例,特別是取決於是否應該允許使用者選擇。

也可以看看:

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