Ubuntu 14.04.4 LTS를 실행하는 VPS가 있습니다. OVH의 Plesk와 함께 전체적으로 설치되었습니다. 방금 apt-get upgrade했고 어느 시점에서 PAM에 관한 메시지를 받았습니다. 시스템은 프랑스어로 되어 있지만 기본적으로 다음과 같이 되어 있습니다.

At least one file of /etc/pam.d/common-{auth,account,password,session} was modified locally. Please indicate if local changes should be discarded and stick with the standard configuration. Otherwise you will have to configure the authentication system by yourself.

로컬 변경 사항을 유지하기로 결정했으며 APT도 다음과 같이 보고했습니다.

pam-auth-update: Local modifications to /etc/pam.d/common-*, not updating.
pam-auth-update: Run pam-auth-update --force to override.

로컬 변경 사항과 업데이트에서 설정하려는 파일의 차이점이 무엇인지 알고 싶습니다. 어떻게 할 수 있습니까?

answer

시스템에서 PAM의 라이브 구성을 변경하고 싶지 않았기 때문에 chroot차이점을 볼 수 있도록 기본 PAM 구성을 설정하기 위해 감옥을 사용하게 되었습니다 .

# lsb_release --codename
Codename:       trusty
# debootstrap trusty /tmp/foo
I: Retrieving Release 
I: Retrieving Release.gpg 
  ...

차이점 보기:

for f in common-{account,auth,password,session,session-noninteractive}; do
  echo ==== $f ====
  diff --unified /etc/pam.d/$f /tmp/foo/etc/pam.d/$f
done

dpkgD구성 파일에 변경 사항이 있는 경우 프롬프트를 표시하고 diff를 볼 수 있도록 허용해야 합니다 .

Configuration file `/etc/bash.bashrc'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** bash.bashrc (Y/I/N/O/D/Z) [default=N] 

업데이트: 아래 주석에서 문제는 완전한 구성 파일(위의 동작이 트리거되는 위치)을 삭제하지 않지만 구성 파일을 생성하기 위해 스크립트 방식을 사용하는 파일에 있는 패키지에 있습니다. 데비안 정책 매뉴얼 로 그 설명 :

E.2 Fully-featured maintainer script configuration handling

For files which contain site-specific information such as the hostname and networking details and so forth, it is better to create the file in the package's postinst script.

This will typically involve examining the state of the rest of the system to determine values and other information, and may involve prompting the user for some information which can't be obtained some other way.

When using this method there are a couple of important issues which should be considered:

If you discover a bug in the program which generates the configuration file, or if the format of the file changes from one version to the next, you will have to arrange for the postinst script to do something sensible - usually this will mean editing the installed configuration file to remove the problem or change the syntax. You will have to do this very carefully, since the user may have changed the file, perhaps to fix the very problem that your script is trying to deal with - you will have to detect these situations and deal with them correctly.

If you do go down this route it's probably a good idea to make the program that generates the configuration file(s) a separate program in /usr/sbin, by convention called packageconfig and then run that if appropriate from the post-installation script. The packageconfig program should not unquestioningly overwrite an existing configuration - if its mode of operation is geared towards setting up a package for the first time (rather than any arbitrary reconfiguration later) you should have it check whether the configuration already exists, and require a --force flag to overwrite it.

packageconfig, PAM의 /usr/sbin/pam-auth-update경우 테스트 실행 또는 미리 보기 옵션을 제공하는 프로그램 에 의존해야 합니다 .

그리고 내가 말할 수 /usr/sbin/pam-auth-update있는 한 그러한 기능을 제공하지 않습니다.

전체 디렉토리의 복사본을 만든 다음 각 파일에 대해 diff를 실행하여 차이점을 확인할 수 있습니다.

cp -r /etc/pam.d/ /home/<user>/
pam-auth-update --force
diff /etc/pam.d/ /home/<user>/pam.d

각 diff를 주의 깊게 살펴보고 나면 변경 사항을 유지할지 아니면 이전 버전으로 되돌릴지 결정할 수 있습니다. 되돌리기는 파일을 원래 위치로 다시 복사하는 것만 큼 간단합니다.

방금이 문제가 발생했습니다. 결국, 나는 pam-auth-update --force파일을 변경 하도록 허용 했습니다. 그리고 이전 파일의 사본도 저장했다는 것을 알았습니다(예: /etc/pam.d/common-foo.pam.old로). 그런 다음 아래의 한 줄짜리가 diff를 보여주었습니다.

for old in *.pam-old; do new="${old:0:-8}"; echo "=== $new ==="; diff $old $new; done

그것:

  1. 백업 복사본을 반복합니다.
  2. 새 파일의 이름을 얻기 위해 마지막 8자를 제거합니다.
  3. 파일 이름을 에코합니다( 각 변경 사항 포함된 파일을 확인할 수 있도록 ). 그리고
  4. 이전 파일과 새 파일을 구별합니다.