For record: FreeBSD has a little different way of storing important login information - Linux stores it in /etc/passwd and /etc/shadow FreeBSD uses only /etc/master.passwd (/etc/passwd is generated from the former for reference).
/etc/master.passwd contains both traditional "passwd" data like name, uid, gid, home shell + password and some administrative values.
So, FreeBSD expects NIS server to provide master.passwd file but and OOB Linux NIS server installation doesn't have it. One must add it to YP database. It's not so hard.
At least on Debian/Ubuntu YP domain data are stored in /var/yp. There is one makefile that simply generates all YP server data files from your ... (choose passwd, group, shadow, hosts ...). Regarding passwords we must generate two databases master.passwd.byuid and master.passwd.byname very similarly as passwd.{byname,byuid} are created. So let's go:
Here is python script that takes custom merger output (shadow+passwd) and makes "master.passwd" compatible file.
#!/usr/bin/python
shell_map = {
"/bin/bash": "/usr/local/bin/bash"
}
def map_shell(shell):
return shell_map.get(shell, shell)
import sys
for line in sys.stdin.readlines():
line = line.strip();
name, passwd, uid, gid, desc, home, shell = line.split(':')
desc_fields = desc.split(",")
gecos = desc_fields[0]
class_name = ""
password_change_time = "0"
account_expiration_time = "0"
shell = map_shell(shell)
all = ":".join([name, passwd, uid, gid, class_name, password_change_time, account_expiration_time, gecos, home, shell])
print all
And here is Makefile snippet that can be inserted to main Makefile or included:
#
# Makefile part for /var/yp/Makefile
#
ALL += master.passwd
MASTER_PASSWD_CONVERTER=python /home/zbigg/projects/nis-linux-freebsd/master.passwd-converter.py ### this is the path to former python script
master.passwd: master.passwd.byname master.passwd.byuid
master.passwd.byuid: $(PASSWD) $(SHADOW) $(YPDIR)/Makefile
@echo "Updating $@"
@$(MERGER) -p $(PASSWD) $(SHADOW) | $(MASTER_PASSWD_CONVERTER) | \
$(AWK) -F: '!/^[-+#]/ { if ($$1 != "" && $$3 >= $(MINUID) && $$3 <= $(MAXUID) && $$3 != $(NFSNOBODYUID) ) \
print $$3"\t"$$0 }' | $(DBLOAD) -i $(GROUP) -o $(YPMAPDIR)/$@ - $@
-@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@
master.passwd.byname: $(PASSWD) $(SHADOW) $(YPDIR)/Makefile
@echo "Updating $@"
@$(MERGER) -p $(PASSWD) $(SHADOW) | $(MASTER_PASSWD_CONVERTER) | \
$(AWK) -F: '!/^[-+#]/ { if ($$1 != "" && $$3 >= $(MINUID) && $$3 <= $(MAXUID) && $$3 != $(NFSNOBODYUID) ) \
print $$1"\t"$$0 }' | $(DBLOAD) -i $(GROUP) -o $(YPMAPDIR)/$@ - $@
-@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@
Works for me :)
When configuring NIS on hosts i've followed these instructions:

