우분투 16.04 서버에 대한 preseed/late_command 디버깅: 티를 찾을 수 없고 존재하지 않는 디렉토리

우분투 16.04 서버에 대한 preseed/late_command 디버깅: 티를 찾을 수 없고 존재하지 않는 디렉토리

우분투 16.04 서버 시스템에서 다음 미리 설정 파일을 실행하려고 합니다(패커 빌드 중):

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" | tee -a /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" | tee -a /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

/var/log/installer/syslog에서 다음 오류를 볼 수 있습니다.

log-output: sh:
log-output: tee: not found

"| tee -a" 부분을 다음과 같이 ">>"로 변경하면:

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" >> /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

mkdir 행에 ​​대해 아무 말도 하지 않고 갑자기 디렉토리를 찾을 수 없다고 불평하기 시작합니다. 따라서 디렉토리를 생성하지도 않고 찾지도 않습니다.

log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: chmod:
log-output: cannot access '/etc/sudoers.d/vagrant'
log-output: : No such file or directory

나는 github에서 다른 스크립트를 조사해 왔습니다. 또한 preseed.cfg 파일에 다음 줄을 추가했습니다.

d-i pkgsel/include string openssh-server coreutils wget sudo

tee를 사용할 수 있는지 확인하기 위해 coreutils를 대상 내 명령으로 설치하려고 시도했습니다. 며칠 동안 우분투를 다시 빌드하면서 syslog에서 동일한 오류를 발견했습니다. 누구든지 이것에 대해 좀 밝힐 수 있다면 - 그것은 단순한 것일 것임에 틀림없지만, 나는 그것을 볼 수 없습니다...

답변1

두가지:

  1. 리디렉션을 수행하면 in-target some_command > /some/path대상 내부에서 발생하지 않습니다. 다음을 수행해야 합니다.in-target --pass-stdout some_command > /target/some/path

  2. in-target명령은 명령의 출력을 로그 파일로 리디렉션합니다. 따라서 출력을 리디렉션하려는 시도는 in-target기본적으로 작동하지 않습니다. 당신이해야 할 일은 --pass-stdout목표 내 인수를 사용하는 것입니다

in-target --pass-stdout echo "hello" > /target/root/hello.txt

그러면 'hello' 콘텐츠가 포함된 /target/root/hello.txt 파일이 생성됩니다.

에서:https://salsa.debian.org/installer-team/debian-installer-utils/-/blob/3e67bc7987eb4a9cdff5fe8d1084e612fe7bb48f/README

in-target: /target에서 지정된 명령을 실행하고 종료 상태를 반환합니다. debconf 패스스루 프런트엔드는 설치 프로그램에서 cdebconf를 사용하여 debconf 질문을 묻는 데 사용됩니다. 이는 dpkg-reconfigure, debconf-apt-progress 및 taskel과 같은 작업을 실행하는 데 특히 유용합니다. 로그 출력 유틸리티는 모든 출력을 기록하는 데 사용됩니다. --pass-stdout 옵션을 사용하여 in-target을 호출하면 로그 출력이 이를 존중합니다.

답변2

echo에 사용하는 것은 작동하지 않는 것 같습니다 in-target. 이 문제를 해결하려면 다음을 시도하십시오(Ubuntu 18.04에서 시도).

d-i preseed/late_command string \
    echo "some text" >> /target/path/to/file.ext ; \
    in-target [some-other-command-in-target]

메모:

  • in-target줄 앞에서는 사용하지 마세요
  • /target실제 경로 이전에 사용
  • in-target다른 명령에서는 대부분 줄 앞에 사용할 수 있습니다

답변3

데비안 설치 프로그램을 사용하려는 경우 17.10.1 서버에서 SSH 공개 키를 Authorized_keys에 추가할 때 이 방법이 효과적이었습니다. .ssh 디렉터리가 미리 생성되어 있는지 확인해야 합니다.

d-i preseed/late_command string in-target /bin/sh -c 'echo "my string" >> /home/username/.ssh/authorized_keys';

나는 이것을 디버깅하는 데 약 하루를 보냈고 다양한 결과로 다음을 시도했습니다. 다양한 non/'in-target' 지시어에 대해 데비안 설치 프로그램에서 어떤 쉘이 사용되는지에 대한 더 자세한 문서가 있다면 좋을 것입니다. 하지만 아마도 올바른 위치를 찾고 있지 않을 것입니다.

  1. 일반 Authorized_keys 경로가 있는 일반 대상 내 에코:

    in-target echo "my string" >> /home/username/.ssh/authorized_keys;
    

    "디렉토리를 찾을 수 없음"을 제공합니다./var/log/installer/syslog

  2. 대상 Authorized_keys 경로가 있는 일반 대상 내 에코:

    in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
    

    대상 머신에 빈 Authorized_keys 파일을 생성하고 볼 때 /var/log/installer/syslog"my string"이 출력되는 것을 발견합니다.stdout

  3. sh -c...명시적 및 대상 Authorized_keys 경로가 있는 대상 내 :

    in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
    

    "디렉토리를 찾을 수 없음" 오류가 발생합니다./var/log/installer/syslog

이를 통해 약간의 시간과 디버깅이 절약되기를 바랍니다.

답변4

echo는 in-target 지시문 내에서 작동합니다. 백틱(`)을 붙여야 합니다. 예를 들어, 미리 설정 파일에서 내 컴퓨터의 호스트 이름을 업데이트하고 싶었습니다.

대상 호스트 이름echo "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')

백틱은 이를 하나의 명령으로 실행하도록 쉘에 지시합니다.

관련 정보