003 File Manager
Current Path:
/usr/sbin
usr
/
sbin
/
📁
..
📄
ac
(10.36 KB)
📄
accton
(5.66 KB)
📄
acpiconf
(9.14 KB)
📄
acpidb
(496.75 KB)
📄
acpidump
(39.86 KB)
📄
adduser
(23.38 KB)
📄
ancontrol
(34.19 KB)
📄
apm
(13.1 KB)
📄
arp
(17.88 KB)
📄
ath3kfw
(14.51 KB)
📄
audit
(5.98 KB)
📄
auditd
(21.79 KB)
📄
auditdistd
(127.49 KB)
📄
auditreduce
(15.34 KB)
📄
authpf
(20.57 KB)
📄
authpf-noip
(20.57 KB)
📄
automount
(50.65 KB)
📄
automountd
(50.65 KB)
📄
autounmountd
(50.65 KB)
📄
bcmfw
(8.68 KB)
📄
bhyve
(374.03 KB)
📄
bhyvectl
(41.55 KB)
📄
bhyveload
(16.41 KB)
📄
binmiscctl
(14.12 KB)
📄
blacklistctl
(33.88 KB)
📄
blacklistd
(41.85 KB)
📄
bluetooth-config
(9.71 KB)
📄
boot0cfg
(15.09 KB)
📄
bootparamd
(15.81 KB)
📄
bootpef
(38.09 KB)
📄
bootptest
(17.37 KB)
📄
bsdconfig
(11.98 KB)
📄
bsdinstall
(3.44 KB)
📄
bsnmpd
(136.55 KB)
📄
bthidcontrol
(36.06 KB)
📄
bthidd
(55.51 KB)
📄
btpand
(32.42 KB)
📄
btxld
(13.49 KB)
📄
callbootd
(9.26 KB)
📄
camdd
(37.59 KB)
📄
cdcontrol
(22.45 KB)
📄
certctl
(7.74 KB)
📄
chkgrp
(9.04 KB)
📄
chkprintcap
(18.22 KB)
📄
chown
(10.23 KB)
📄
chroot
(8.31 KB)
📄
ckdist
(16.18 KB)
📄
clear_locks
(6.23 KB)
📄
config
(56.23 KB)
📄
cpucontrol
(20.03 KB)
📄
crashinfo
(8.21 KB)
📄
cron
(44.9 KB)
📄
ctladm
(66.98 KB)
📄
ctld
(123.97 KB)
📄
cxgbetool
(2.86 MB)
📄
daemon
(15.76 KB)
📄
dconschat
(22.84 KB)
📄
devctl
(11.83 KB)
📄
devinfo
(8.68 KB)
📄
diskinfo
(19.2 KB)
📄
dtrace
(35.91 KB)
📄
dumpcis
(26.69 KB)
📄
dwatch
(36.59 KB)
📄
editmap
(84.02 KB)
📄
edquota
(22.9 KB)
📄
efibootmgr
(22.04 KB)
📄
efidp
(9.79 KB)
📄
efivar
(14.77 KB)
📄
etcupdate
(43.94 KB)
📄
extattrctl
(16.63 KB)
📄
fdcontrol
(14.94 KB)
📄
fdformat
(18.52 KB)
📄
fdread
(17.14 KB)
📄
fdwrite
(10.19 KB)
📄
fifolog_create
(9.03 KB)
📄
fifolog_reader
(31.19 KB)
📄
fifolog_writer
(15.57 KB)
📄
flowctl
(12.19 KB)
📄
fmtree
(36.11 KB)
📄
freebsd-update
(91.6 KB)
📄
fstyp
(19.38 KB)
📄
ftp-proxy
(28.19 KB)
📄
fwcontrol
(32.87 KB)
📄
gensnmptree
(29.26 KB)
📄
getextattr
(11.24 KB)
📄
getfmac
(6.78 KB)
📄
getpmac
(6.9 KB)
📄
gpioctl
(11.71 KB)
📄
gssd
(34.37 KB)
📄
gstat
(23.22 KB)
📄
hccontrol
(174.81 KB)
📄
hcsecd
(30.18 KB)
📄
hcseriald
(10.12 KB)
📄
hostapd
(876.65 KB)
📄
hostapd_cli
(79.18 KB)
📄
hoststat
(8.41 KB)
📄
hv_kvp_daemon
(21.99 KB)
📄
hv_vss_daemon
(9.45 KB)
📄
i2c
(14.99 KB)
📄
iasl
(1.34 MB)
📄
idprio
(7.61 KB)
📄
ifmcstat
(12.74 KB)
📄
inetd
(47.88 KB)
📄
iostat
(19.66 KB)
📄
iovctl
(19.91 KB)
📄
ip6addrctl
(12.2 KB)
📄
ipfwpcap
(10.79 KB)
📄
iprop-log
(24.89 KB)
📄
iscsid
(37.38 KB)
📄
iwmbtfw
(19.09 KB)
📄
jail
(68.96 KB)
📄
jexec
(8.85 KB)
📄
jls
(15.11 KB)
📄
kbdcontrol
(39.62 KB)
📄
kbdmap
(16.16 KB)
📄
keyserv
(24.67 KB)
📄
kgmon
(13.02 KB)
📄
kldxref
(29.59 KB)
📄
kstash
(9.68 KB)
📄
ktutil
(38.81 KB)
📄
l2control
(12.84 KB)
📄
l2ping
(10.6 KB)
📄
lastlogin
(8.5 KB)
📄
local-unbound
(148.45 KB)
📄
local-unbound-anchor
(38.63 KB)
📄
local-unbound-checkconf
(29.43 KB)
📄
local-unbound-control
(33.32 KB)
📄
local-unbound-setup
(11.7 KB)
📄
lockstat
(49.98 KB)
📄
lpc
(55.95 KB)
📄
lpd
(82.2 KB)
📄
lptcontrol
(6.48 KB)
📄
lptest
(6.03 KB)
📄
lsextattr
(11.24 KB)
📄
mailstats
(73.28 KB)
📄
mailwrapper
(8.41 KB)
📄
makefs
(183.64 KB)
📄
makemap
(89.47 KB)
📄
manctl
(7.75 KB)
📄
memcontrol
(11.88 KB)
📄
mergemaster
(43.59 KB)
📄
mfiutil
(75.3 KB)
📄
mixer
(12.14 KB)
📄
mld6query
(10.53 KB)
📄
mlx5tool
(11.54 KB)
📄
mlxcontrol
(19.72 KB)
📄
mount_smbfs
(15.29 KB)
📄
mountd
(54.05 KB)
📄
moused
(40.59 KB)
📄
mprutil
(33.95 KB)
📄
mpsutil
(33.95 KB)
📄
mptable
(15.74 KB)
📄
mptutil
(46.35 KB)
📄
mtest
(17.24 KB)
📄
mtree
(60.94 KB)
📄
ndis_events
(9.19 KB)
📄
ndiscvt
(39.78 KB)
📄
ndisgen
(15.83 KB)
📄
ndp
(24.03 KB)
📄
newsyslog
(46.39 KB)
📄
nfscbd
(10.15 KB)
📄
nfsd
(22.62 KB)
📄
nfsdumpstate
(8.02 KB)
📄
nfsrevoke
(6.08 KB)
📄
nfsuserd
(16.87 KB)
📄
ngctl
(29.15 KB)
📄
nghook
(10.09 KB)
📄
nmtree
(60.94 KB)
📄
nologin
(625.77 KB)
📄
nscd
(87.91 KB)
📄
ntp-keygen
(205.75 KB)
📄
ntpd
(842.26 KB)
📄
ntpdate
(126.85 KB)
📄
ntpdc
(268.29 KB)
📄
ntptime
(83.42 KB)
📄
pac
(28.74 KB)
📄
pciconf
(37.38 KB)
📄
periodic
(4.19 KB)
📄
pkg
(32.22 KB)
📄
plockstat
(22.91 KB)
📄
pmc
(167.45 KB)
📄
pmcannotate
(15.8 KB)
📄
pmccontrol
(11.81 KB)
📄
pmcstat
(77.77 KB)
📄
pnfsdscopymr
(9.09 KB)
📄
pnfsdsfile
(10.01 KB)
📄
pnfsdskill
(6.26 KB)
📄
portsnap
(29.86 KB)
📄
powerd
(15.97 KB)
📄
ppp
(427.13 KB)
📄
pppctl
(15.77 KB)
📄
praliases
(86.38 KB)
📄
praudit
(9.13 KB)
📄
prometheus_sysctl_exporter
(13.91 KB)
📄
pstat
(14.47 KB)
📄
purgestat
(8.41 KB)
📄
pw
(74.28 KB)
📄
pwd_mkdb
(16.71 KB)
📄
pwm
(10.45 KB)
📄
quot
(14.92 KB)
📄
quotaoff
(8.29 KB)
📄
quotaon
(8.29 KB)
📄
rarpd
(16.11 KB)
📄
repquota
(11.14 KB)
📄
rfcomm_pppd
(13.8 KB)
📄
rip6query
(7.69 KB)
📄
rmextattr
(11.24 KB)
📄
rmt
(9.48 KB)
📄
rmuser
(8.96 KB)
📄
route6d
(46.17 KB)
📄
rpc.lockd
(64.46 KB)
📄
rpc.statd
(22.27 KB)
📄
rpc.umntall
(12.3 KB)
📄
rpc.yppasswdd
(41.08 KB)
📄
rpc.ypupdated
(18.19 KB)
📄
rpc.ypxfrd
(16.12 KB)
📄
rpcbind
(43.91 KB)
📄
rrenumd
(34.28 KB)
📄
rtadvctl
(31.52 KB)
📄
rtadvd
(70.95 KB)
📄
rtprio
(7.61 KB)
📄
rtsold
(40.09 KB)
📄
rwhod
(17.15 KB)
📄
sa
(23.57 KB)
📄
sade
(48.1 KB)
📄
sdpcontrol
(15.98 KB)
📄
sdpd
(38.07 KB)
📄
sendmail
(8.41 KB)
📄
service
(4.84 KB)
📄
services_mkdb
(14.02 KB)
📄
sesutil
(20.83 KB)
📄
setextattr
(11.24 KB)
📄
setfib
(7.2 KB)
📄
setfmac
(14.27 KB)
📄
setfsmac
(14.27 KB)
📄
setpmac
(6.11 KB)
📄
smbmsg
(10.09 KB)
📄
snapinfo
(7.46 KB)
📄
sntp
(324.31 KB)
📄
spi
(15.59 KB)
📄
spkrtest
(3.62 KB)
📄
spray
(7.8 KB)
📄
sshd
(302.45 KB)
📄
swapinfo
(14.47 KB)
📄
syslogd
(53.15 KB)
📄
sysrc
(22.64 KB)
📄
tcpdchk
(19.85 KB)
📄
tcpdmatch
(16.88 KB)
📄
tcpdrop
(10.25 KB)
📄
tcpdump
(936.43 KB)
📄
traceroute
(33.23 KB)
📄
traceroute6
(30.32 KB)
📄
trim
(9.41 KB)
📄
trpt
(11.45 KB)
📄
tzsetup
(20.19 KB)
📄
uathload
(9.28 KB)
📄
uefisign
(20.87 KB)
📄
ugidfw
(8.57 KB)
📄
uhsoctl
(26.11 KB)
📄
usbconfig
(26.59 KB)
📄
usbdump
(16.42 KB)
📄
utx
(7.81 KB)
📄
valectl
(12.23 KB)
📄
vidcontrol
(27.79 KB)
📄
vidfont
(16.16 KB)
📄
vigr
(2.42 KB)
📄
vipw
(7.2 KB)
📄
wake
(7.33 KB)
📄
watch
(12.79 KB)
📄
watchdog
(15.37 KB)
📄
watchdogd
(15.37 KB)
📄
wlandebug
(16.26 KB)
📄
wpa_cli
(529.82 KB)
📄
wpa_passphrase
(37.72 KB)
📄
wpa_supplicant
(926.5 KB)
📄
yp_mkdb
(11.82 KB)
📄
ypbind
(20.45 KB)
📄
ypinit
(8.8 KB)
📄
ypldap
(93.28 KB)
📄
yppoll
(7.91 KB)
📄
yppush
(23.81 KB)
📄
ypserv
(43.55 KB)
📄
ypset
(7.36 KB)
📄
zdb
(164.94 KB)
📄
zdump
(13.48 KB)
📄
zfsd
(102.01 KB)
📄
zhack
(16.02 KB)
📄
zic
(42.48 KB)
📄
zonectl
(13.94 KB)
📄
zzz
(1.23 KB)
Editing: adduser
#!/bin/sh # # SPDX-License-Identifier: BSD-2-Clause-FreeBSD # # Copyright (c) 2002-2004 Michael Telahun Makonnen. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Email: Mike Makonnen <mtm@FreeBSD.Org> # # $FreeBSD$ # # err msg # Display $msg on stderr, unless we're being quiet. # err() { if [ -z "$quietflag" ]; then echo 1>&2 ${THISCMD}: ERROR: $* fi } # info msg # Display $msg on stdout, unless we're being quiet. # info() { if [ -z "$quietflag" ]; then echo ${THISCMD}: INFO: $* fi } # get_nextuid # Output the value of $_uid if it is available for use. If it # is not, output the value of the next higher uid that is available. # If a uid is not specified, output the first available uid, as indicated # by pw(8). # get_nextuid () { _uid=$1 _nextuid= if [ -z "$_uid" ]; then _nextuid="`${PWCMD} usernext | cut -f1 -d:`" else while : ; do ${PWCMD} usershow $_uid > /dev/null 2>&1 if [ ! "$?" -eq 0 ]; then _nextuid=$_uid break fi _uid=$(($_uid + 1)) done fi echo $_nextuid } # show_usage # Display usage information for this utility. # show_usage() { echo "usage: ${THISCMD} [options]" echo " options may include:" echo " -C save to the configuration file only" echo " -D do not attempt to create the home directory" echo " -E disable this account after creation" echo " -G additional groups to add accounts to" echo " -L login class of the user" echo " -M file permission for home directory" echo " -N do not read configuration file" echo " -S a nonexistent shell is not an error" echo " -d home directory" echo " -f file from which input will be received" echo " -g default login group" echo " -h display this usage message" echo " -k path to skeleton home directory" echo " -m user welcome message file" echo " -q absolute minimal user feedback" echo " -s shell" echo " -u uid to start at" echo " -w password type: no, none, yes or random" } # valid_shells # Outputs a list of valid shells from /etc/shells. Only the # basename of the shell is output. # valid_shells() { _prefix= cat ${ETCSHELLS} | while read _path _junk ; do case $_path in \#*|'') ;; *) echo -n "${_prefix}`basename $_path`" _prefix=' ' ;; esac done # /usr/sbin/nologin is a special case [ -x "${NOLOGIN_PATH}" ] && echo -n " ${NOLOGIN}" } # fullpath_from_shell shell # Given $shell, which is either the full path to a shell or # the basename component of a valid shell, get the # full path to the shell from the /etc/shells file. # fullpath_from_shell() { _shell=$1 [ -z "$_shell" ] && return 1 # /usr/sbin/nologin is a special case; it needs to be handled # before the cat | while loop, since a 'return' from within # a subshell will not terminate the function's execution, and # the path to the nologin shell might be printed out twice. # if [ "$_shell" = "${NOLOGIN}" -o \ "$_shell" = "${NOLOGIN_PATH}" ]; then echo ${NOLOGIN_PATH} return 0; fi cat ${ETCSHELLS} | while read _path _junk ; do case "$_path" in \#*|'') ;; *) if [ "$_path" = "$_shell" -o \ "`basename $_path`" = "$_shell" ]; then echo $_path return 0 fi ;; esac done return 1 } # shell_exists shell # If the given shell is listed in ${ETCSHELLS} or it is # the nologin shell this function will return 0. # Otherwise, it will return 1. If shell is valid but # the path is invalid or it is not executable it # will emit an informational message saying so. # shell_exists() { _sh="$1" _shellchk="${GREPCMD} '^$_sh$' ${ETCSHELLS} > /dev/null 2>&1" if ! eval $_shellchk; then # The nologin shell is not listed in /etc/shells. if [ "$_sh" != "${NOLOGIN_PATH}" ]; then err "Invalid shell ($_sh) for user $username." return 1 fi fi ! [ -x "$_sh" ] && info "The shell ($_sh) does not exist or is not executable." return 0 } # save_config # Save some variables to a configuration file. # Note: not all script variables are saved, only those that # it makes sense to save. # save_config() { echo "# Configuration file for adduser(8)." > ${ADDUSERCONF} echo "# NOTE: only *some* variables are saved." >> ${ADDUSERCONF} echo "# Last Modified on `${DATECMD}`." >> ${ADDUSERCONF} echo '' >> ${ADDUSERCONF} echo "defaultHomePerm=$uhomeperm" >> ${ADDUSERCONF} echo "defaultLgroup=$ulogingroup" >> ${ADDUSERCONF} echo "defaultclass=$uclass" >> ${ADDUSERCONF} echo "defaultgroups=$ugroups" >> ${ADDUSERCONF} echo "passwdtype=$passwdtype" >> ${ADDUSERCONF} echo "homeprefix=$homeprefix" >> ${ADDUSERCONF} echo "defaultshell=$ushell" >> ${ADDUSERCONF} echo "udotdir=$udotdir" >> ${ADDUSERCONF} echo "msgfile=$msgfile" >> ${ADDUSERCONF} echo "disableflag=$disableflag" >> ${ADDUSERCONF} echo "uidstart=$uidstart" >> ${ADDUSERCONF} } # add_user # Add a user to the user database. If the user chose to send a welcome # message or lock the account, do so. # add_user() { # Is this a configuration run? If so, don't modify user database. # if [ -n "$configflag" ]; then save_config return fi _uid= _name= _comment= _gecos= _home= _group= _grouplist= _shell= _class= _dotdir= _expire= _pwexpire= _passwd= _upasswd= _passwdmethod= _name="-n '$username'" [ -n "$uuid" ] && _uid='-u "$uuid"' [ -n "$ulogingroup" ] && _group='-g "$ulogingroup"' [ -n "$ugroups" ] && _grouplist='-G "$ugroups"' [ -n "$ushell" ] && _shell='-s "$ushell"' [ -n "$uclass" ] && _class='-L "$uclass"' [ -n "$ugecos" ] && _comment='-c "$ugecos"' [ -n "$udotdir" ] && _dotdir='-k "$udotdir"' [ -n "$uexpire" ] && _expire='-e "$uexpire"' [ -n "$upwexpire" ] && _pwexpire='-p "$upwexpire"' if [ -z "$Dflag" -a -n "$uhome" ]; then # The /nonexistent home directory is special. It # means the user has no home directory. if [ "$uhome" = "$NOHOME" ]; then _home='-d "$uhome"' else # Use home directory permissions if specified if [ -n "$uhomeperm" ]; then _home='-m -d "$uhome" -M "$uhomeperm"' else _home='-m -d "$uhome"' fi fi elif [ -n "$Dflag" -a -n "$uhome" ]; then _home='-d "$uhome"' fi case $passwdtype in no) _passwdmethod="-w no" _passwd="-h -" ;; yes) # Note on processing the password: The outer double quotes # make literal everything except ` and \ and $. # The outer single quotes make literal ` and $. # We can ensure the \ isn't treated specially by specifying # the -r switch to the read command used to obtain the input. # _passwdmethod="-w yes" _passwd="-h 0" _upasswd='echo "$upass" |' ;; none) _passwdmethod="-w none" ;; random) _passwdmethod="-w random" ;; esac _pwcmd="$_upasswd ${PWCMD} useradd $_uid $_name $_group $_grouplist $_comment" _pwcmd="$_pwcmd $_shell $_class $_home $_dotdir $_passwdmethod $_passwd" _pwcmd="$_pwcmd $_expire $_pwexpire" if ! _output=`eval $_pwcmd` ; then err "There was an error adding user ($username)." return 1 else info "Successfully added ($username) to the user database." if [ "random" = "$passwdtype" ]; then randompass="$_output" info "Password for ($username) is: $randompass" fi fi if [ -n "$disableflag" ]; then if ${PWCMD} lock $username ; then info "Account ($username) is locked." else info "Account ($username) could NOT be locked." fi fi _line= _owner= _perms= if [ -n "$msgflag" ]; then [ -r "$msgfile" ] && { # We're evaluating the contents of an external file. # Let's not open ourselves up for attack. _perms will # be empty if it's writeable only by the owner. _owner # will *NOT* be empty if the file is owned by root. # _dir="`dirname $msgfile`" _file="`basename $msgfile`" _perms=`/usr/bin/find $_dir -name $_file -perm +07022 -prune` _owner=`/usr/bin/find $_dir -name $_file -user 0 -prune` if [ -z "$_owner" -o -n "$_perms" ]; then err "The message file ($msgfile) may be writeable only by root." return 1 fi cat "$msgfile" | while read _line ; do eval echo "$_line" done | ${MAILCMD} -s"Welcome" ${username} info "Sent welcome message to ($username)." } fi } # get_user # Reads username of the account from standard input or from a global # variable containing an account line from a file. The username is # required. If this is an interactive session it will prompt in # a loop until a username is entered. If it is batch processing from # a file it will output an error message and return to the caller. # get_user() { _input= # No need to take down user names if this is a configuration saving run. [ -n "$configflag" ] && return while : ; do if [ -z "$fflag" ]; then echo -n "Username: " read _input else _input="`echo "$fileline" | cut -f1 -d:`" fi # There *must* be a username, and it must not exist. If # this is an interactive session give the user an # opportunity to retry. # if [ -z "$_input" ]; then err "You must enter a username!" [ -z "$fflag" ] && continue fi ${PWCMD} usershow $_input > /dev/null 2>&1 if [ "$?" -eq 0 ]; then err "User exists!" [ -z "$fflag" ] && continue fi break done username="$_input" } # get_gecos # Reads extra information about the user. Can be used both in interactive # and batch (from file) mode. # get_gecos() { _input= # No need to take down additional user information for a configuration run. [ -n "$configflag" ] && return if [ -z "$fflag" ]; then echo -n "Full name: " read _input else _input="`echo "$fileline" | cut -f7 -d:`" fi ugecos="$_input" } # get_shell # Get the account's shell. Works in interactive and batch mode. It # accepts either the base name of the shell or the full path. # If an invalid shell is entered it will simply use the default shell. # get_shell() { _input= _fullpath= ushell="$defaultshell" # Make sure the current value of the shell is a valid one if [ -z "$Sflag" ]; then if ! shell_exists $ushell ; then info "Using default shell ${defaultshell}." ushell="$defaultshell" fi fi if [ -z "$fflag" ]; then echo -n "Shell ($shells) [`basename $ushell`]: " read _input else _input="`echo "$fileline" | cut -f9 -d:`" fi if [ -n "$_input" ]; then if [ -n "$Sflag" ]; then ushell="$_input" else _fullpath=`fullpath_from_shell $_input` if [ -n "$_fullpath" ]; then ushell="$_fullpath" else err "Invalid shell ($_input) for user $username." info "Using default shell ${defaultshell}." ushell="$defaultshell" fi fi fi } # get_homedir # Reads the account's home directory. Used both with interactive input # and batch input. # get_homedir() { _input= if [ -z "$fflag" ]; then echo -n "Home directory [${homeprefix}/${username}]: " read _input else _input="`echo "$fileline" | cut -f8 -d:`" fi if [ -n "$_input" ]; then uhome="$_input" # if this is a configuration run, then user input is the home # directory prefix. Otherwise it is understood to # be $prefix/$user # [ -z "$configflag" ] && homeprefix="`dirname $uhome`" || homeprefix="$uhome" else uhome="${homeprefix}/${username}" fi } # get_homeperm # Reads the account's home directory permissions. # get_homeperm() { uhomeperm=$defaultHomePerm _input= _prompt= if [ -n "$uhomeperm" ]; then _prompt="Home directory permissions [${uhomeperm}]: " else _prompt="Home directory permissions (Leave empty for default): " fi if [ -z "$fflag" ]; then echo -n "$_prompt" read _input fi if [ -n "$_input" ]; then uhomeperm="$_input" fi } # get_uid # Reads a numeric userid in an interactive or batch session. Automatically # allocates one if it is not specified. # get_uid() { uuid=${uidstart} _input= _prompt= if [ -n "$uuid" ]; then uuid=`get_nextuid $uuid` _prompt="Uid [$uuid]: " else _prompt="Uid (Leave empty for default): " fi if [ -z "$fflag" ]; then echo -n "$_prompt" read _input else _input="`echo "$fileline" | cut -f2 -d:`" fi [ -n "$_input" ] && uuid=$_input uuid=`get_nextuid $uuid` uidstart=$uuid } # get_class # Reads login class of account. Can be used in interactive or batch mode. # get_class() { uclass="$defaultclass" _input= _class=${uclass:-"default"} if [ -z "$fflag" ]; then echo -n "Login class [$_class]: " read _input else _input="`echo "$fileline" | cut -f4 -d:`" fi [ -n "$_input" ] && uclass="$_input" } # get_logingroup # Reads user's login group. Can be used in both interactive and batch # modes. The specified value can be a group name or its numeric id. # This routine leaves the field blank if nothing is provided and # a default login group has not been set. The pw(8) command # will then provide a login group with the same name as the username. # get_logingroup() { ulogingroup="$defaultLgroup" _input= if [ -z "$fflag" ]; then echo -n "Login group [${ulogingroup:-$username}]: " read _input else _input="`echo "$fileline" | cut -f3 -d:`" fi # Pw(8) will use the username as login group if it's left empty [ -n "$_input" ] && ulogingroup="$_input" } # get_groups # Read additional groups for the user. It can be used in both interactive # and batch modes. # get_groups() { ugroups="$defaultgroups" _input= _group=${ulogingroup:-"${username}"} if [ -z "$configflag" ]; then [ -z "$fflag" ] && echo -n "Login group is $_group. Invite $username" [ -z "$fflag" ] && echo -n " into other groups? [$ugroups]: " else [ -z "$fflag" ] && echo -n "Enter additional groups [$ugroups]: " fi read _input [ -n "$_input" ] && ugroups="$_input" } # get_expire_dates # Read expiry information for the account and also for the password. This # routine is used only from batch processing mode. # get_expire_dates() { upwexpire="`echo "$fileline" | cut -f5 -d:`" uexpire="`echo "$fileline" | cut -f6 -d:`" } # get_password # Read the password in batch processing mode. The password field matters # only when the password type is "yes" or "random". If the field is empty and the # password type is "yes", then it assumes the account has an empty passsword # and changes the password type accordingly. If the password type is "random" # and the password field is NOT empty, then it assumes the account will NOT # have a random password and set passwdtype to "yes." # get_password() { # We may temporarily change a password type. Make sure it's changed # back to whatever it was before we process the next account. # [ -n "$savedpwtype" ] && { passwdtype=$savedpwtype savedpwtype= } # There may be a ':' in the password upass=${fileline#*:*:*:*:*:*:*:*:*:} if [ -z "$upass" ]; then case $passwdtype in yes) # if it's empty, assume an empty password passwdtype=none savedpwtype=yes ;; esac else case $passwdtype in random) passwdtype=yes savedpwtype=random ;; esac fi } # input_from_file # Reads a line of account information from standard input and # adds it to the user database. # input_from_file() { _field= while read -r fileline ; do case "$fileline" in \#*|'') ;; *) get_user || continue get_gecos get_uid get_logingroup get_class get_shell get_homedir get_homeperm get_password get_expire_dates ugroups="$defaultgroups" add_user ;; esac done } # input_interactive # Prompts for user information interactively, and commits to # the user database. # input_interactive() { _disable= _pass= _passconfirm= _random="no" _emptypass="no" _usepass="yes" _logingroup_ok="no" _groups_ok="no" case $passwdtype in none) _emptypass="yes" _usepass="yes" ;; no) _usepass="no" ;; random) _random="yes" ;; esac get_user get_gecos get_uid # The case where group = user is handled elsewhere, so # validate any other groups the user is invited to. until [ "$_logingroup_ok" = yes ]; do get_logingroup _logingroup_ok=yes if [ -n "$ulogingroup" -a "$username" != "$ulogingroup" ]; then if ! ${PWCMD} show group $ulogingroup > /dev/null 2>&1; then echo "Group $ulogingroup does not exist!" _logingroup_ok=no fi fi done until [ "$_groups_ok" = yes ]; do get_groups _groups_ok=yes for i in $ugroups; do if [ "$username" != "$i" ]; then if ! ${PWCMD} show group $i > /dev/null 2>&1; then echo "Group $i does not exist!" _groups_ok=no fi fi done done get_class get_shell get_homedir get_homeperm while : ; do echo -n "Use password-based authentication? [$_usepass]: " read _input [ -z "$_input" ] && _input=$_usepass case $_input in [Nn][Oo]|[Nn]) passwdtype="no" ;; [Yy][Ee][Ss]|[Yy][Ee]|[Yy]) while : ; do echo -n "Use an empty password? (yes/no) [$_emptypass]: " read _input [ -n "$_input" ] && _emptypass=$_input case $_emptypass in [Nn][Oo]|[Nn]) echo -n "Use a random password? (yes/no) [$_random]: " read _input [ -n "$_input" ] && _random="$_input" case $_random in [Yy][Ee][Ss]|[Yy][Ee]|[Yy]) passwdtype="random" break ;; esac passwdtype="yes" [ -n "$configflag" ] && break trap 'stty echo; exit' 0 1 2 3 15 stty -echo echo -n "Enter password: " IFS= read -r upass echo'' echo -n "Enter password again: " IFS= read -r _passconfirm echo '' stty echo # if user entered a blank password # explicitly ask again. [ -z "$upass" -a -z "$_passconfirm" ] \ && continue ;; [Yy][Ee][Ss]|[Yy][Ee]|[Yy]) passwdtype="none" break; ;; *) # invalid answer; repeat the loop continue ;; esac if [ "$upass" != "$_passconfirm" ]; then echo "Passwords did not match!" continue fi break done ;; *) # invalid answer; repeat loop continue ;; esac break; done _disable=${disableflag:-"no"} while : ; do echo -n "Lock out the account after creation? [$_disable]: " read _input [ -z "$_input" ] && _input=$_disable case $_input in [Nn][Oo]|[Nn]) disableflag= ;; [Yy][Ee][Ss]|[Yy][Ee]|[Yy]) disableflag=yes ;; *) # invalid answer; repeat loop continue ;; esac break done # Display the information we have so far and prompt to # commit it. # _disable=${disableflag:-"no"} [ -z "$configflag" ] && printf "%-10s : %s\n" Username $username case $passwdtype in yes) _pass='*****' ;; no) _pass='<disabled>' ;; none) _pass='<blank>' ;; random) _pass='<random>' ;; esac [ -z "$configflag" ] && printf "%-10s : %s\n" "Password" "$_pass" [ -n "$configflag" ] && printf "%-10s : %s\n" "Pass Type" "$passwdtype" [ -z "$configflag" ] && printf "%-10s : %s\n" "Full Name" "$ugecos" [ -z "$configflag" ] && printf "%-10s : %s\n" "Uid" "$uuid" printf "%-10s : %s\n" "Class" "$uclass" printf "%-10s : %s %s\n" "Groups" "${ulogingroup:-$username}" "$ugroups" printf "%-10s : %s\n" "Home" "$uhome" printf "%-10s : %s\n" "Home Mode" "$uhomeperm" printf "%-10s : %s\n" "Shell" "$ushell" printf "%-10s : %s\n" "Locked" "$_disable" while : ; do echo -n "OK? (yes/no): " read _input case $_input in [Nn][Oo]|[Nn]) return 1 ;; [Yy][Ee][Ss]|[Yy][Ee]|[Yy]) add_user ;; *) continue ;; esac break done return 0 } #### END SUBROUTINE DEFINITION #### THISCMD=`/usr/bin/basename $0` DEFAULTSHELL=/bin/sh ADDUSERCONF="${ADDUSERCONF:-/etc/adduser.conf}" PWCMD="${PWCMD:-/usr/sbin/pw}" MAILCMD="${MAILCMD:-mail}" ETCSHELLS="${ETCSHELLS:-/etc/shells}" NOHOME="/nonexistent" NOLOGIN="nologin" NOLOGIN_PATH="/usr/sbin/nologin" GREPCMD="/usr/bin/grep" DATECMD="/bin/date" # Set default values # username= uuid= uidstart= ugecos= ulogingroup= uclass= uhome= uhomeperm= upass= ushell= udotdir=/usr/share/skel ugroups= uexpire= upwexpire= shells="`valid_shells`" passwdtype="yes" msgfile=/etc/adduser.msg msgflag= quietflag= configflag= fflag= infile= disableflag= Dflag= Sflag= readconfig="yes" homeprefix="/home" randompass= fileline= savedpwtype= defaultclass= defaultLgroup= defaultgroups= defaultshell="${DEFAULTSHELL}" defaultHomePerm= # Make sure the user running this program is root. This isn't a security # measure as much as it is a useful method of reminding the user to # 'su -' before he/she wastes time entering data that won't be saved. # procowner=${procowner:-`/usr/bin/id -u`} if [ "$procowner" != "0" ]; then err 'you must be the super-user (uid 0) to use this utility.' exit 1 fi # Override from our conf file # Quickly go through the commandline line to see if we should read # from our configuration file. The actual parsing of the commandline # arguments happens after we read in our configuration file (commandline # should override configuration file). # for _i in $* ; do if [ "$_i" = "-N" ]; then readconfig= break; fi done if [ -n "$readconfig" ]; then # On a long-lived system, the first time this script is run it # will barf upon reading the configuration file for its perl predecessor. if ( . ${ADDUSERCONF} > /dev/null 2>&1 ); then [ -r ${ADDUSERCONF} ] && . ${ADDUSERCONF} > /dev/null 2>&1 fi fi # Process command-line options # for _switch ; do case $_switch in -L) defaultclass="$2" shift; shift ;; -C) configflag=yes shift ;; -D) Dflag=yes shift ;; -E) disableflag=yes shift ;; -k) udotdir="$2" shift; shift ;; -f) [ "$2" != "-" ] && infile="$2" fflag=yes shift; shift ;; -g) defaultLgroup="$2" shift; shift ;; -G) defaultgroups="$2" shift; shift ;; -h) show_usage exit 0 ;; -d) homeprefix="$2" shift; shift ;; -m) case "$2" in [Nn][Oo]) msgflag= ;; *) msgflag=yes msgfile="$2" ;; esac shift; shift ;; -M) defaultHomePerm=$2 shift; shift ;; -N) readconfig= shift ;; -w) case "$2" in no|none|random|yes) passwdtype=$2 ;; *) show_usage exit 1 ;; esac shift; shift ;; -q) quietflag=yes shift ;; -s) defaultshell="`fullpath_from_shell $2`" shift; shift ;; -S) Sflag=yes shift ;; -u) uidstart=$2 shift; shift ;; esac done # If the -f switch was used, get input from a file. Otherwise, # this is an interactive session. # if [ -n "$fflag" ]; then if [ -z "$infile" ]; then input_from_file elif [ -n "$infile" ]; then if [ -r "$infile" ]; then input_from_file < $infile else err "File ($infile) is unreadable or does not exist." fi fi else input_interactive while : ; do if [ -z "$configflag" ]; then echo -n "Add another user? (yes/no): " else echo -n "Re-edit the default configuration? (yes/no): " fi read _input case $_input in [Yy][Ee][Ss]|[Yy][Ee]|[Yy]) uidstart=`get_nextuid $uidstart` input_interactive continue ;; [Nn][Oo]|[Nn]) echo "Goodbye!" ;; *) continue ;; esac break done fi
Upload File
Create Folder