
FreeNASシステム用のrsyncベースのバックアップを開発しています。
バックアッププロセスの一部には、バックアップストアとして機能するリモートシステムにログインすることが含まれます。これを行うたびにメッセージが表示されます。
Could not create directory '/root/.ssh'.
/root
手動で作成しようとすると、次のメッセージが受信されるため、~/.ssh
これは読み取り専用であるためと仮定します。
mkdir: /root/.ssh: Read-only file system
したがって、known_hosts
このファイルは私にとってより適切なバックアッププロセスに移動し、-o UserKnownHostsFile
それに関連するすべての問題を解決するために使用されます。
しかし、私が呼び出すときにssh
まだフォルダを作成しようとします。~/.ssh
フォルダを作成しないようにするにはどうすればよいですか?
答え1
ここで言及されている解決策は問題ありませんが、〜/ .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バイトなので、実際にバッファをオーバーフローして(HOMEを256バイトより長い文字列として定義)、if条件をバイパスすることができます。たとえば、次のようになります。
export HOME=$HOME/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
答え2
ルートファイルシステムを読み取り/書き込みで一時的に再マウントし、sshの場所への.ssh用のシンボリックリンクを作成します。できる書く。これにより、退屈な追加手順を実行することなく、SSHキーを追加したり、将来の新しい既知のホストを許可したりするなどの作業を実行できます。 そして-o UserKnownHostsFile
同時に選択を放棄することもできます。