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
동시에 선택을 포기할 수도 있습니다.