빨간 모자샘플 스크립트가 있습니다NIS에서 FreeIPA로 사용자를 마이그레이션합니다. nis-user.sh
다음과 같습니다.
#!/bin/sh
# $1 is the NIS domain, $2 is the NIS master server
ypcat -d $1 -h $2 passwd > /dev/shm/nis-map.passwd 2>&1
IFS=$'\n'
for line in $(cat /dev/shm/nis-map.passwd) ; do
IFS=' '
username=$(echo $line | cut -f1 -d:)
# Not collecting encrypted password because we need cleartext password
# to create kerberos key
uid=$(echo $line | cut -f3 -d:)
gid=$(echo $line | cut -f4 -d:)
gecos=$(echo $line | cut -f5 -d:)
homedir=$(echo $line | cut -f6 -d:)
shell=$(echo $line | cut -f7 -d:)
# Now create this entry
echo passw0rd1 | ipa user-add $username --first=NIS --last=USER \
--password --gidnumber=$gid --uid=$uid --gecos='$gecos' --homedir=$homedir \
--shell=$shell
ipa user-show $username
done
이는 이름을 NIS로 설정하고 성을 USER로 설정합니다. 우리 /etc/passwd
파일에는 다음과 같은 사용자가 포함되어 있습니다.
juser:x:4841:200:Jane Q. User:/home/juser:/bin/tcsh
kuser:x:5761:200:User, K.:/home/kuser:/bin/bash
물론 상황이 복잡해집니다. 다음은 이름과 성을 추출할 수 있다는 제안을 받았습니다. 이를 반대로 하고 쉼표(예: kuser)로 구분하면 대부분의 이름이 캡처됩니다.
first=$(echo $gecos | sed -e 's/\(.*\), \(.*$\)/\2 \1/' | awk '{print $1}'
last=$(echo $gecos | sed -e 's/\(.*\), \(.*$\)/\2 \1/' | awk '{print $NF}'
$first
및 은(는) 어떻게 사용합니까 $last
?
테스트하기 위해 변수 결과를 $gecos
다음과 같이 파이핑해 보았습니다 awk
.
first=$(echo $line | cut -f5 -d: | awk '{print $1}':)
awk: cmd. line:1: {print $1}:
awk: cmd. line:1: ^ syntax error
gecos=
다음 줄(이 줄 뒤에) 만 추가하려고 하면 동일한 오류가 발생합니다 .
first=$(echo $gecos | awk '{print $1}':)
편집: 아아, 콜론 위치가 나를 끌어당깁니다. 이것은 작동합니다:
first=$(echo $gecos | sed -e 's/\(.*\), \(.*$\)/\2 \1/' | awk '{print $1}')
last=$(echo $gecos | sed -e 's/\(.*\), \(.*$\)/\2 \1/' | awk '{print $NF}')
이제 다음 부분으로 넘어갑니다…
그럼 나도 데려가고 싶어이 제안, 다음과 같이 CRYPT를 사용하여 해시된 비밀번호를 가져옵니다.
userpassword='{CRYPT}$6$blahblah$moregibberish' testuser
이것이 중요한지 확실하지 않지만 /etc/libuser.conf
에서는crypt_style = sha512
내가 추가한 스크립트에 다음을 추가했습니다.
password1=$(echo $line | cut -f2 -d:)
그리고지금 이 항목을 작성하세요부분:
--setattr "userpassword='{CRYPT}$password1'"
디버깅이 켜져 있을 때 기록되는 내용은 다음과 같습니다.
[Tue Feb 02 22:08:52.541857 2021] [wsgi:error] [pid 16097:tid 16365] [remote x.x.x.x:59726] ipa: INFO: [jsonserver_session] [email protected]: user_add/1('john', givenname='John', sn='Smith', homedirectory='/home/smith', gecos="'John Smith'", loginshell='/bin/tcsh', uidnumber=5319, gidnumber=150, setattr=("userpassword='{CRYPT}the-actual-hash-of-the-password'",), version='2.239'): SUCCESS
그럼 이건 {CRYPT}
설명이 안 되는 것 같은데요? 또한 일부 디버깅도 추가했습니다.
echo "Password hash value is $password1"
인쇄되는 것은 원래 해시 값 sans 입니다 {CRYPT}
.
따라서 스크립트 외부에서 테스트하기 위해 테스트 사용자를 추가했습니다.
ipa user-add --first=test --last=user --setattr userpassword='{CRYPT} the-actual-hash-of-the-password' testuser
그런 다음 다음 명령을 실행했는데 비밀번호가 작동했습니다.
ldapsearch -x -D 'uid=testuser,cn=users,cn=accountsdc=ourdomain,dc=edu' -W
# testuser, users, accounts, ourdomain.edu
dn: uid=testuser,cn=users,cn=accounts,dc=ourdomain,dc=edu
givenName: test
sn: user
uid: testuser
cn: test user
displayName: test user
initials: tu
gecos: test user
krbPrincipalName: [email protected]
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: fasuser
objectClass: ipaSshGroupOfPubKeys
objectClass: mepOriginEntry
loginShell: /bin/sh
homeDirectory: /home/testuser
mail: [email protected]
krbCanonicalName: [email protected]
ipaUniqueID: 34ee1f48-65d2-11eb-8c33-001ec9ab7ef0
uidNumber: 1520800007
gidNumber: 1520800007
memberOf: cn=ipausers,cn=groups,cn=accounts,dc=ourdomain,dc=edu
krbLastPwdChange: 20210203034524Z
krbPasswordExpiration: 20210504034524Z
# testuser, groups, accounts, ourdomain.edu
dn: cn=testuser,cn=groups,cn=accounts,dc=ourdomain,dc=edu
objectClass: posixgroup
objectClass: ipaobject
objectClass: mepManagedEntry
objectClass: top
cn: testuser
gidNumber: 1520800007
description: User private group for testuser
mepManagedBy: uid=testuser,cn=users,cn=accounts,dc=ourdomain,dc
=edu
ipaUniqueID: 34f39b4e-65d2-11eb-8c33-001ec9ab7ef0
# search result
search: 2
result: 0 Success
현재 버전에서도 가능할까요?
답변1
2가지 수정 사항:
--setattr "userpassword={CRYPT}$password1" --gidnumber=$gid
또한 사용자 이름을 설정하는 스크립트 상단에서 echo 명령을 큰따옴표로 묶습니다.
username="$(echo $line | cut -f1 -d:)"
따라서 최종 스크립트는 다음과 같아야 합니다.
#!/bin/sh
# $1 is the NIS domain, $2 is the NIS master server
ypcat -d $1 -h $2 passwd > /dev/shm/nis-map.passwd 2>&1
IFS=$'\n'
for line in $(cat /dev/shm/nis-map.passwd) ; do
IFS=' '
username="$(echo $line | cut -f1 -d:)"
# Not collecting encrypted password because we need cleartext password
# to create kerberos key
uid=$(echo $line | cut -f3 -d:)
gid=$(echo $line | cut -f4 -d:)
gecos=$(echo $line | cut -f5 -d:)
homedir=$(echo $line | cut -f6 -d:)
shell=$(echo $line | cut -f7 -d:)
# Now create this entry
echo passw0rd1 | ipa user-add $username --first=NIS --last=USER \
--password --gidnumber=$gid --uid=$uid --gecos='$gecos' --homedir=$homedir \
--shell=$shell
ipa user-show $username
done
중간 이니셜이나 성, 이름이 포함된 항목을 처리하려면 다음 명령을 사용할 수 있습니다.
# Change Last, First to First Last. (Fill in dummy for empty gecos.)
if [ -z "$gecos" ]; then
firstlast='First Last'
else
firstlast=$(echo $gecos | sed -e 's/\(.*\), \(.*$\)/\2 \1/')
fi
# Extract First and Last into separate variables
first=$(echo $firstlast | awk '/^(\w|[-'\''])+ \w\. / { print $1,
$2; } \
/^(\w|[-'\''])+ (\w|[-'\''])+(
|$)/ {
print $1; }' )
#echo this dollar 1 $1 this is dollar 2 $2
last=$(echo $firstlast | awk 'BEGIN {ORS=" ";} \
/^(\w|[-'\''])+ \w\. / { for (i=3;
i<=NF; i++) print $i; } \
/^(\w|[-'\''])+ (\w|[-'\''])+(
|$)/ {
for (i=2; i<=NF; i++) print $i; }' \
| sed 's/ *$//' )