그 안에 이런 문자열이 있어요/etc/mail/virtusertable
[email protected] error:nouser Account temporary disabled
[email protected] error:nouser Account temporary disabled
[email protected] error:nouser Account temporary disabled
모든 것을 내가 얻을 수 error:nouser Account temporary disabled
있는 적절한 콘텐츠로 바꾸고 싶습니다.virtuser_NNN
/etc/dovecot/dovecot.passwd
나는 같은 결과로 다른 변형을 시도했습니다. 모두를 error:nouser Account temporary disabled
첫 번째 것으로 교체하십시오 virtuser_NNN
./etc/dovecot/dovecot.passwd
내 스크립트를 실행하면 다음과 같습니다.
[email protected] virtuser_1
[email protected] virtuser_1
[email protected] virtuser_1
내 스크립트는 다음과 같습니다
cat /etc/mail/virtusertable_back | grep example.com |
grep 'error:nouser Account temporary disabled' | awk '{print $1}' |
xargs -I{} grep {} /etc/dovecot/dovecot.passwd | awk -F'::' '{print $2}' |
xargs -I{} sh -c 'grep {} /etc/passwd' | awk -F: '{print $1}'|
xargs -n1 -P1 -I{} sed -i 's/error\:nouser Account temporary disabled/{}/' /etc/mail/virtusertable_back
예, 저는 이 작업을 복사하고 있습니다 /etc/mail/virtusertable
.
그리고 /etc/dovecot/dovecot.passwd
다음과 같은 형식의 기록이 있습니다.
[email protected]:*$1$hash here:user id:group id::/var/www/userlogin/data/email/example.com/mail:::/var/mail/virtuser_NNNN
추가하려면 전체 파일이 아닌 특정 메일 도메인의 해당 VM에만 적용되도록 오류 메시지가 포함된 문자열을 변경하고 싶습니다.
답변1
나는 이것을 하기 위해 Perl을 사용할 것이다. 이메일과 관련 사용자 이름을 /etc/dovecot/dovecot.passwd
해시에 저장하고 다음으로 바꿉니다 /etc/mail/virtusertable
.
$ perl -i -ape 'BEGIN{
open($fh,"/etc/dovecot/dovecot.passwd");
while(<$fh>){ @G=split(/:/); $k{$G[0]}=$G[2]; }
}
s/error:nouser Account temporary disabled/$k{$F[0]}/ if defined $k{$F[0]};
' /etc/mail/virtusertable > newfile
설명하다
-i
Perl 은 sed -i
.-a
@F
좋다 awk
. -p
"제공된 스크립트를 적용한 후 각 줄을 인쇄합니다"를 의미합니다 -e
.
스크립트 자체는 (입력 파일을 읽기 전에 ) /etc/dovecot/dovecot.passwd
청크 로 읽고 각 행을 배열 로 분할한 다음 각 이메일을 값이 사용자 이름인 해시의 키로 저장합니다 .BEGIN{}
/etc/mail/virtusertable
:
@G
%k
/etc/mail/virtusertable
완료되면 처리가 계속되며 각 사용자 이름이 첫 번째 필드(정의된 경우)의 이메일에 해당하는 사용자 이름으로 대체됩니다.error:nouser Account temporary disabled
답변2
백슬래시가 없으면 다음 파이프가 제대로 작동합니다.virtuser_NNN이름:
tbl=/etc/mail/virtusertable
pw=/etc/dovecot/dovecot.passwd
cut -d: -f1 "$pw" |
grep -Fnf- "$tbl"|
sed -e's|:.*/\(.*\)|s/:nouser/:\1/|' |
sed -f- "$tbl"
그것은:
먼저
cut
각 줄에서 콜론이 아닌 문자의 첫 번째 시퀀스를 제외한 모든 문자를 제거합니다.dovecot.passwd
grep
-F
고정 문자열 일치 결과 의 경우virtusertable
s///
줄 번호와 슬래시가 아닌 문자 시퀀스의 마지막 항목을 제외하고 이 결과의 모든 문자를 문자열로 바꿉니다. 예를 들면 다음과 같습니다.[LINENO]
s/:nouser/:
not-slashes
/
마지막으로 사용한저것
sed
스크립트 로 출력virtusertable