Shell
將 ssh 輸出重定向到文件更改行結尾
首先,如果我做一個簡單的,
ssh admin@example.com "cat backup.tar" > backup.tar
這不會發生!所以,還有其他東西在轉換它,我不知道。我需要在不授予伺服器訪問權限的情況下提供系統目前狀態的備份。我所做的如下:
- 創建一個新使用者。我們叫他吧
username
- 只允許通過 ssh-key 訪問
- 將鑰匙放入
authorized-keys
- 將命令/外殼更改
/etc/passwd
為自定義腳本username
- 自定義腳本通過執行數據庫轉儲並複制一些文件來獲取數據,並最終創建一個 tar 存檔到
stdout
- 確保沒有額外的輸出到
stdout
.要獲取您需要做的數據:
ssh username@example.com > backup.tar
.現在,除了行尾發生了變化之外,幾乎一切都執行良好。變大
tar
了,我可以看到每一行都有以^M
符號結尾的 dos 行。如果我強制dos2unix
二進制 tar 文件,該文件與伺服器上的文件匹配。為什麼會發生這種情況以及是什麼改變了行尾?我什至將其簡化為以下內容:伺服器上用於
username
連結的腳本/etc/passwd
只是 make a並且當使用上述命令登錄並將輸出重定向到我本地電腦上的文件cat .viminfo
時,行結尾仍然傳輸錯誤。ssh``username
可能發生的情況:在
ssh
沒有命令參數(也沒有指定選項)的情況下呼叫時,預設情況下會在遠端系統上為會話分配RemoteCommand
一個偽終端。無論遠端系統配置為執行什麼命令,都會發生這種情況。偽終端通常配置為將換行字元轉換為輸入 + 換行序列(LF
→CRLF
,請參閱此答案以獲得詳細說明)。因此,您的腳本的輸出被寫入一個偽終端設備,該設備對其進行更改,然後發送到客戶端。可以通過多種方式防止分配偽終端,包括:
- 在客戶端使用選項呼叫(或
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 :
);儘管我認為這只不過是一種解決方法)。當然,最合適的選項取決於您的案例,特別是取決於是否應該允許使用者選擇。
也可以看看:
- 創建一個僅執行一個命令的 UNIX 帳戶- 對於部分替代方法,請注意,正如對您的問題的評論中指出的那樣,用作使用者預設解釋器的腳本確實(可能)阻止使用者獲取 shell,但是也可以添加自己的可利用元素。