Ssh
如何阻止 ssh 嘗試創建 ~/.ssh?
我正在為 FreeNAS 系統開發基於 rsync 的備份。
備份過程的一部分涉及登錄到用作備份儲存的遠端系統。每當我這樣做時,我都會收到消息
Could not create directory '/root/.ssh'.
我假設這是因為它
/root
是只讀的,因為當我嘗試~/.ssh
手動創建時,我收到:mkdir: /root/.ssh: Read-only file system
因此,我已經移動了
known_hosts
更適合我的備份過程的文件,並正在使用-o UserKnownHostsFile
它來解決與此相關的任何問題。但是,當我呼叫它時
ssh
仍會嘗試創建該文件夾。~/.ssh
我怎樣才能讓它不嘗試創建文件夾?
臨時重新掛載根文件系統讀寫並為 .ssh 創建一個符號連結,該連結指向 ssh可以寫入的位置。通過這種方式,您還可以在將來執行諸如添加 ssh 密鑰之類的操作,或者允許新的 known_hosts 而無需執行額外的繁重步驟。 你可以同時擺脫你的
-o UserKnownHostsFile
選擇。
這裡提到的解決方案很好,但我正在尋找一個不需要 ~/.ssh 存在或需要嘗試創建它的解決方案(在 Windows 上執行,分發 MSYS 建構的 ssh.exe,但在其他沒有安裝 MSYS/Cygwin 的機器)。
不幸的是,無論您賦予什麼價值,該常式似乎都在原始碼中進行了硬編碼
UserKnownHostsFile
:r = snprintf(buf, sizeof buf, "%s%s%s", pw->pw_dir, strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR); if (r > 0 && (size_t)r < sizeof(buf) && stat(buf, &st) < 0) { #ifdef WITH_SELINUX ssh_selinux_setfscreatecon(buf); #endif if (mkdir(buf, 0700) < 0) error("Could not create directory '%.200s'.", buf); #ifdef WITH_SELINUX ssh_selinux_setfscreatecon(NULL); #endif }
但是,有趣的是,它嘗試擴展
$HOME
環境變數以確定主目錄。由於緩衝區大約為 256 字節,我們實際上可以通過溢出緩衝區來繞過 if 條件(將 HOME 定義為長於 256 字節的字元串),例如:export HOME=$HOME/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.