Ssh

如何阻止 ssh 嘗試創建 ~/.ssh?

  • June 9, 2017

我正在為 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/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.

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