|
Home | Switchboard | Unix Administration | Red Hat | TCP/IP Networks | Neoliberalism | Toxic Managers |
(slightly skeptical) Educational society promoting "Back to basics" movement against IT overcomplexity and bastardization of classic Unix |
News | Redbooks | IBM Links | Recommended Links | Using Smit | |
mkuser | chuser | chsh | chfn | lsuser | passwd |
chpasswd | pwdadm | rmuser | |||
Useful AIX commands | smit | sudo | Tips | Humor | Etc |
|
Now that you are familiar with the files behind the commands, take a look at the commands themselves. You'll learn how to create a user as well as modify a user after it has been created.
|
The first command to know is mkuser
. Without mkuser
,
the rest of the commands are useless. You use this command to create the
AIX user and set its initial values. There are a few simple rules to remember
when creating a user:
-
) +
) @
) ~
) :
) '
or "
)
#
) ,
) =
) \
or /
)
?
) `
) To verify the setting in AIX 5.3 and later, you can extract the value
from getconf
:
# getconf LOGIN_NAME_MAX 9or
lsattr
:
# lsattr -El sys0 SW_dist_intr false Enable SW distribution of interrupts True autorestart true Automatically REBOOT OS after a crash True boottype disk N/A False capacity_inc 1.00 Processor capacity increment False capped true Partition is capped False conslogin enable System Console Login False cpuguard enable CPU Guard True dedicated true Partition is dedicated False enhanced_RBAC true Enhanced RBAC Mode True ent_capacity 1.00 Entitled processor capacity False frequency 2656000000 System Bus Frequency False fullcore true Enable full CORE dump True fwversion IBM,EL340_075 Firmware version and revision levels False id_to_partition 0X80000CE988400001 Partition ID False id_to_system 0X80000CE988400000 System ID False iostat false Continuously maintain DISK I/O history True keylock normal State of system keylock at boot time False log_pg_dealloc true Log predictive memory page deallocation events True max_capacity 1.00 Maximum potential processor capacity False max_logname 9 Maximum login name length at boot time True maxbuf 20 Maximum number of pages in block I/O BUFFER CACHE True maxmbuf 0 Maximum Kbytes of real memory allowed for MBUFS True maxpout 0 HIGH water mark for pending write I/Os per file True maxuproc 800 Maximum number of PROCESSES allowed per user True min_capacity 1.00 Minimum potential processor capacity False minpout 0 LOW water mark for pending write I/Os per file True modelname IBM,8203-E4A Machine name False ncargs 256 ARG/ENV list size in 4K byte blocks True nfs4_acl_compat secure NFS4 ACL Compatibility Mode True pre430core false Use pre-430 style CORE dump True pre520tune disable Pre-520 tuning compatibility mode True realmem 3784704 Amount of usable physical memory in Kbytes False rtasversion 1 Open Firmware RTAS version False sed_config select Stack Execution Disable (SED) Mode True systemid IBM,021082744 Hardware system identifier False variable_weight 0 Variable processor capacity weight False
To change the value, simply adjust the v_max_logname
parameter
(shown as max_logname
in lsattr
) using chdev
to the maximum number of characters desired plus one to accommodate the
terminating character. For example, if you want to have user names that
are 128 characters long, you would adjust the v_max_logname
parameter to 129:
# chdev -l sys0 -a max_logname=129 sys0 changed
Please note that this change will not go into effect until you have rebooted the operating system. Once the server has been rebooted, you can verify that the change has taken effect:
# getconf LOGIN_NAME_MAX 128
Keep in mind, however, that if your environment includes IBM RS/6000® servers prior to AIX version 5.3 or operating systems that cannot handle user names longer than eight characters and you rely on NIS or other authentication measures, it would be wise to continue with the eight-character user names.
To create a user with default settings and allocate the next available
UID, simply execute mkuser
plus the user name as the root user:
# mkuser xander # finger xander Login name: xander Directory: /home/xander Shell: /usr/bin/ksh No Plan.
By adding some values found in the chuser
man page (man
chuser
), you can include the user's GECOS information and change
his or her core ulimit
to 524,288, as in example below:
# mkuser core=524288 gecos="Xander Cormany,317.555.1234" xander # finger xander Login name: xander In real life: Xander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/ksh No Plan. # su - xander "-c ulimit -a" time(seconds) unlimited file(blocks) unlimited data(kbytes) unlimited stack(kbytes) 4194304 memory(kbytes) unlimited coredump(blocks) 524288 nofiles(descriptors) unlimited threads(per process) unlimited processes(per user) unlimitedIt's worth mentioning that the GECOS, like any other field in /etc/passwd, should not include a colon (
:
) in the value. By trying to add
a colon, the fields will be adjusted, and all expected values would shift
to the right. For instance, if the user tried to have Xander:Cormany
in the GECOS field in /etc/passwd, Xander would actually be in the
correct field, while Cormany would be the value of the field to the
right (that is, the home directory). Also, the GECOS field cannot end with
!#
.
Most administrators do not really use the command line like this, but
it is important to understand what utilities like SMIT (man smit
or man smitty
) are doing behind the scenes. If you would rather
continue through SMIT, the process is simple. Here's an example of creating
the same user with the same attributes through SMIT. By entering SMIT
directly into the user creation screen, you go in using the fastpath
mkuser
:
# smitty mkuserWhen you are finished filling out the user name, GECOS field, and core
ulimit
, click Enter to create the user. When SMIT returns
that the command finished successfully, click F10 or Esc + 0
to exit the program. You can verify the user using the code:# finger xander Login name: xander In real life: Xander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/ksh No Plan. # su - xander "-c ulimit -a" time(seconds) unlimited file(blocks) unlimited data(kbytes) unlimited stack(kbytes) 4194304 memory(kbytes) unlimited coredump(blocks) 524288 nofiles(descriptors) unlimited threads(per process) unlimited processes(per user) unlimited
The hard part is done now. But wait: Xander's manager, Ann, just came
by and informed you that Xander's core ulimit
should have been
1,048,576 (someone forgot to multiply by 2). No problem: Just change the
ulimit
with chuser
.
The chuser
command works very much like mkuser
in syntax and uses the identical attributes. An example of the chuser
command.
# chuser core=1048576 xander # su - xander "-c ulimit -a" time(seconds) unlimited file(blocks) unlimited data(kbytes) unlimited stack(kbytes) 4194304 memory(kbytes) unlimited coredump(blocks) 1048576 nofiles(descriptors) unlimited threads(per process) unlimited processes(per user) unlimitedAs always, IBM has made these commands easily accessible in SMIT using fastpaths. Logically,
smitty chuser
takes you directly to the user modification
screen.
There are times when you want to change your shell. The default shell
in AIX is the Korn shell, or ksh. To change the shell, execute chsh
with the user's name, and then select the desired shell:
# finger xander Login name: xander In real life: Xander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/ksh No Plan. # chsh xander Current available shells: /bin/sh /bin/bsh /bin/csh /bin/ksh /bin/tsh /bin/ksh93 /usr/bin/sh /usr/bin/bsh /usr/bin/csh /usr/bin/ksh /usr/bin/tsh /usr/bin/ksh93 /usr/bin/rksh /usr/bin/rksh93 /usr/sbin/uucp/uucico /usr/sbin/sliplogin /usr/sbin/snappd xander's current login shell: /usr/bin/ksh Change (yes) or (no)? > yes To?>/usr/bin/csh # finger xander Login name: xander In real life: Xander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/csh No Plan.
The administrator who created Xander's AIX user introduced a typo into
his name in the GECOS information. To correct the mistake, you use the
chfn
command. This command works much like chsh
,
where the command displays the current value, asks the user whether he or
she wants to change it, and then changes the value to what was entered.
For example:
# finger xander Login name: xander In real life: Zander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/ksh No Plan. # chfn xander xander's current gecos: "Zander Cormany,317.555.1234" Change (yes) or (no)? > yes To?>Xander Cormany,317.555.1234 # finger xander Login name: xander In real life: Xander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/ksh No Plan.
Correcting the GECOS information may sound trivial, but it is helpful
to the other administrators and users on the system. For example, if you're
trying to find Xander's account but can't remember his user name, you could
search for it through his GECOS information. Searching for his last name,
which was correctly entered into the GECOS field, would quickly show me
his user name. The finger
command will search for all instances
of the string entered in /etc/passwd's user name and real name in the first
field of the GECOS information:
# finger cormany Login name: atc In real life: Adam Cormany Directory: /home/cormany Shell: /bin/ksh No Plan. Login name: xander In real life: Xander Cormany Site Info: 317.555.1234 Directory: /home/xander Shell: /usr/bin/ksh No Plan.
Gathering all the information for a user from the various user files
may seem cumbersome. Fortunately, AIX provides a command to gather the data
in one fell swoop. The lsuser
command returns all the attributes
used on the user from the various administration files, which can be very
helpful if you are comparing users, wanting to generate a complete listing
of all users for backup purposes, or are troubleshooting an issue with an
individual account.
To view a user's attributes, you can use the -f
switch,
which displays everything in a stanza structure:
# lsuser -f xander xander: id=214 pgrp=staff groups=staff home=/home/xander shell=/usr/bin/ksh gecos=Xander Cormany,317.555.1234 login=true su=true rlogin=true daemon=true admin=false sugroups=ALL admgroups= tpath=nosak ttys=ALL expires=0 auth1=SYSTEM auth2=NONE umask=22 registry=files SYSTEM=compat logintimes= loginretries=0 pwdwarntime=0 account_locked=false minage=0 maxage=0 maxexpired=-1 minalpha=0 minother=0 mindiff=0 maxrepeats=8 minlen=0 histexpire=0 histsize=0 pwdchecks= dictionlist= default_roles= fsize=-1 cpu=-1 data=-1 stack=-1 core=1048576 rss=-1 nofiles=-1 roles=
If you are comparing users, simply change the switch from -f
to -c
and add the users you want to compare as a comma-delimited
argument.
# lsuser -c xander,atc #name:id:pgrp:groups:home:shell:gecos:login:su:rlogin:daemon:admin: sugroups:tpath:ttys:expires:auth1:auth2:umask:registry:SYSTEM:loginretries: pwdwarntime:account_locked:minage:maxage:maxexpired:minalpha:minother: mindiff:maxrepeats:minlen:histexpire:histsize:fsize:cpu:data:stack:core:rss:nofiles xander:214:staff:staff:/home/xander:/usr/bin/ksh:Xander Cormany,317.555.1234: true:true:true:true:false:ALL:nosak:ALL:0:SYSTEM:NONE:22:files:compat:0:0:false: 0:0:-1:0:0:0:8:0:0:0:-1:-1:-1:-1:1048576:-1:-1 #name:id:pgrp:groups:home:shell:gecos:login:su:rlogin:daemon:admin:sugroups: tpath:ttys:expires:auth1:auth2:umask:registry:SYSTEM:loginretries:pwdwarntime: account_locked:minage:maxage:maxexpired:minalpha:minother:mindiff:maxrepeats: minlen:histexpire:histsize:fsize:cpu:data:stack:core:rss:nofiles:time_last_login: time_last_unsuccessful_login:tty_last_login:tty_last_unsuccessful_login:host_last_login: host_last_unsuccessful_login:unsuccessful_login_count cormany:215:staff:staff,support:/home/cormany:/bin/ksh:Adam Cormany:true:true: true:true:false:ALL:nosak:ALL:0:SYSTEM:NONE:22:NIS:compat:0:0:false:0:0: -1:0:0:0:8:0:0:0:-1:-1:-1:-1:-1:-1:-1:1250854405:1250522447:/dev/pts/3:/dev/pts/13: 10.20.30.40:10.20.30.41:0
That is a lot of information to look at and may be a bit overwhelming in its raw form. However, if you import this data into a spreadsheet, it will look much cleaner. Having a delimited format is also helpful when you are using the data in scripts to manage users.
If you are only looking for a few fields—say, the user's shell and home
directory—the lsuser
command can do the work for you with the
-a
switch. Listing 13
provides an example of this command using the fields from the chuser
man page.
# lsuser -c -a shell home xander,cormany #name:shell:home xander:/usr/bin/ksh:/home/xander #name:shell:home cormany:/bin/ksh:/home/cormany
Many think the passwd
command only changes a user's password.
Although passwd
does perform this important function, it contains
other features, as well.
The most important function of passwd
is indeed changing
a user's password. By following the rules set forth in the configuration
files /etc/security/user and /etc/security/passwd, a standard user can change
his or her own password or, if logged in as the root user, can change other
users' passwords, for example:
# lsuser -c -a password xander #name:password xander:* # passwd xander Changing password for "xander" xander's New password: Enter the new password again: # lsuser -c -a password xander #name:password xander:!
The passwd
command can also change a user's GECOS information
like chfn
or his or her shell/command to execute during the
login process, like chsh
. For example:
# passwd -f xander xander's current gecos: "Xander Cormany,317.555.1234" Change (yes) or (no)? > yes To?>Xander Cormany,317.555.7890 # passwd -s xander Current available shells: /bin/sh /bin/bsh /bin/csh /bin/ksh /bin/tsh /bin/ksh93 /usr/bin/sh /usr/bin/bsh /usr/bin/csh /usr/bin/ksh /usr/bin/tsh /usr/bin/ksh93 /usr/bin/rksh /usr/bin/rksh93 /usr/sbin/uucp/uucico /usr/sbin/sliplogin /usr/sbin/snappd xander's current login shell: /usr/bin/ksh Change (yes) or (no)? > yes To?>/usr/bin/bsh # finger xander Login name: xander In real life: Xander Cormany Site Info: 317.555.7890 Directory: /home/xander Shell: /usr/bin/bsh No Plan.
The pwdadm
command can change passwords in AIX. In addition,
pwdadm
can display (excluding encrypted passwords) or update
a user's flags in /etc/security/passwd. Continuing with Xander's account
as a guinea pig, First change his password, and then view his current password
attributes. Because his password was just changed, the ADMCHG
flag will be set. Change that flag to ADMIN
, and restrict the
account so that only administrators can update the password going forward.
# pwdadm xander Changing password for "xander" xander's New password: Enter the new password again: # pwdadm -q xander xander: lastupdate = 1250858719 flags = ADMCHG # pwdadm -f ADMIN xander # pwdadm -q xander xander: lastupdate = 1250858719 flags = ADMIN
The time has come to remove a user from the system; Xander's account
must be deleted. To do so, you need rmuser
.
To remove a user, simply execute rmuser
with the user's
account name as the argument. Doing so with no switches removes the user
from the system, but the user's password information will be retained in
the /etc/security/passwd file:
# rmuser xander
To fully remove the user's password information, use the -p
switch:
# rmuser –p xander
Note that rmuser
does not remove the user's home directory.
If a user has important data in his or her home directory that should be
kept, it is up to you to remove the home directories when you deem it safe.
You're familiar with a few user modification commands; now, let's talk about groups. Like user administration, it's important that you know the configuration files behind the commands that modify them.
The /etc/group file contains the basics of a group. For example:
system:!:0:root,pconsole,esaadmin staff:!:1:ipsec,esaadmin,sshd,xander bin:!:2:root,bin sys:!:3:root,bin,sys adm:!:4:bin,adm uucp:!:5:uucp,nuucp mail:!:6: security:!:7:root cron:!:8:root printq:!:9:lp audit:!:10:root ecs:!:28: nobody:!:4294967294:nobody,lpd perf:!:20: shutdown:!:21: lp:!:11:root,lp invscout:!:12:invscout snapp:!:13:snapp ipsec:!:200: pconsole:!:14:pconsole sshd:!:201:sshd
As you can see, the file is colon delimited like the /etc/passwd file, and each entry contains only four fields in the following format (with spaces added before and after the delimiter to ease reading):
Group Name : Password Flag : GID : User(s)
Here's the line-by-line breakdown:
Note: This field is comma delimited.
The /etc/security/group file is much like /etc/security/user for users: It contains extended attributes to the specified group:
Parameter | Format | Description |
---|---|---|
adms |
user1, user2, … | Comma-delimited list of users with administrative rights to the group. |
admin |
TRUE | FALSE | If True, the group has administrative rights to the group. |
For more attributes, read the man page for /etc/security/group (man
group
), or visit
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/group.htm.
The file is broken down into stanzas like the other configuration files
in /etc/security, with the group name as the identifier. A nice feature
of this file is that it allows you to set administrator rights to a standard
user for a group. The administrators of that group can then modify the group
as they see fit by adding members to or removing members from the group.
Listing 18 provides an example
of what an /etc/security/group looks like. In this example, the group jradmin
has admin
set to False and standard users pac and xander defined
as administrators of the group.
system: admin = true staff: admin = false bin: admin = true sys: admin = true jradmin: admin = false adms = pac,xander
You've read enough about the files behind the commands. Now, let's look at the commands themselves. You'll see how to create a group as well as modify it after it has been created.
Creating a group in AIX is simple and straightforward. The same restrictions for creating a user pertain to creating a group:
-
). +
) @
) ~
) :
) '
or "
)
#
) ,
) =
) \
or /
)
?
) `
) Both user and group name lengths are handled by the same parameter:
v_max_logname
. To view or change the value, follow the instructions
provided for viewing and changing the user name length in
mkuser, earlier in this article.
To create a group, simply execute the mkgroup
command with
the group name as an argument, as shown in in example:
# mkgroup atctest # grep atctest /etc/group atctest:!:202: # grep -p atctest /etc/security/group atctest: admin = false
To create an admin group, add the -a
switch, as shown in
example:
# mkgroup -a atcadmin # grep atcadmin /etc/group atcadmin:!:15: # grep -p atcadmin /etc/security/group atcadmin: admin = true
To create a group and add Xander as the administrator of the group, add
the adm
section of the /etc/security/group stanza to the command
line, as shown in example below:
# mkgroup adms=xander xangroup # grep xangroup /etc/group xangroup:!:203: # grep -p xangroup /etc/security/group xangroup: admin = false adms = xander
Like mkuser
, mkgroup
follows the same attributes
as chgroup
. For a full list of the attributes, read chgroup
's
man page (man chgroup
).
The chgroup
command works just like chuser
,
and its man page contains all the attributes you can change on a group.
Listing 22 provides an example
of how to change the group's xangroup
GID from 203 to 204.
Add a few users to the group, as well.
# grep xangroup /etc/group xangroup:!:203: # chgroup id=204 users=xander,atc,amdc xangroup # grep xangroup /etc/group xangroup:!:204:xander,atc,amdc
Another way to modify a group's members is with chgrpmem
.
The chgrpmem
command allows you to list, add, and remove users
from a group as well as modify the administrators of the group.
For example, the group xangroup has xander and atc as members and xander as an administrator of the group. Remove atc from the group:
# chgrpmem xangroup xangroup: members = xander,atc adms = xander # chgrpmem -m - atc xangroup # chgrpmem xangroup xangroup: members = xander adms = xander
Suppose there was a mistake and user atc was not supposed to be removed. Instead, user atc was supposed to become the administrator of the group, while xander's administrative rights were to be removed. Listing 24 shows the code to make the correction.
# chgrpmem -m + atc xangroup # chgrpmem -a + atc xangroup # chgrpmem -a - xander xangroup # chgrpmem xangroup xangroup: members = xander,atc adms = atc
With such a nice command for users as lsuser
, shouldn't
there be one for groups, as well? There is: lsgroup
. To continue
with the standard format of commands and their options in AIX, lsgroup
follows the same structure as lsuser
.
# lsgroup xangroup xangroup id=204 admin=false users=xander,cormany adms=cormany registry=files # lsgroup -f xangroup xangroup: id=204 admin=false users=xander,cormany adms=cormany registry=files # lsgroup -c xangroup,atcadmin #name:id:admin:users:adms:registry xangroup:204:false:xander,cormany:cormany:files #name:id:admin:registry atcadmin:15:true:files # lsgroup -c -a id xangroup,atcadmin #name:id xangroup:204 #name:id atcadmin:15
Throughout this article, you've been creating sample groups. Now, it's
time to clean up the AIX system you're using. To remove a group from the
system, simply execute rmgroup
with the group's name as the
argument:
# rmgroup atctest
The rmgroup
command does not allow you to remove the group
until you have moved all users that have the group as their primary group
to another group.
AIX user and group administration by Adam Cormany
getconf
: See IBM's man page for the getconf
command. chuser
command. Society
Groupthink : Two Party System as Polyarchy : Corruption of Regulators : Bureaucracies : Understanding Micromanagers and Control Freaks : Toxic Managers : Harvard Mafia : Diplomatic Communication : Surviving a Bad Performance Review : Insufficient Retirement Funds as Immanent Problem of Neoliberal Regime : PseudoScience : Who Rules America : Neoliberalism : The Iron Law of Oligarchy : Libertarian Philosophy
Quotes
War and Peace : Skeptical Finance : John Kenneth Galbraith :Talleyrand : Oscar Wilde : Otto Von Bismarck : Keynes : George Carlin : Skeptics : Propaganda : SE quotes : Language Design and Programming Quotes : Random IT-related quotes : Somerset Maugham : Marcus Aurelius : Kurt Vonnegut : Eric Hoffer : Winston Churchill : Napoleon Bonaparte : Ambrose Bierce : Bernard Shaw : Mark Twain Quotes
Bulletin:
Vol 25, No.12 (December, 2013) Rational Fools vs. Efficient Crooks The efficient markets hypothesis : Political Skeptic Bulletin, 2013 : Unemployment Bulletin, 2010 : Vol 23, No.10 (October, 2011) An observation about corporate security departments : Slightly Skeptical Euromaydan Chronicles, June 2014 : Greenspan legacy bulletin, 2008 : Vol 25, No.10 (October, 2013) Cryptolocker Trojan (Win32/Crilock.A) : Vol 25, No.08 (August, 2013) Cloud providers as intelligence collection hubs : Financial Humor Bulletin, 2010 : Inequality Bulletin, 2009 : Financial Humor Bulletin, 2008 : Copyleft Problems Bulletin, 2004 : Financial Humor Bulletin, 2011 : Energy Bulletin, 2010 : Malware Protection Bulletin, 2010 : Vol 26, No.1 (January, 2013) Object-Oriented Cult : Political Skeptic Bulletin, 2011 : Vol 23, No.11 (November, 2011) Softpanorama classification of sysadmin horror stories : Vol 25, No.05 (May, 2013) Corporate bullshit as a communication method : Vol 25, No.06 (June, 2013) A Note on the Relationship of Brooks Law and Conway Law
History:
Fifty glorious years (1950-2000): the triumph of the US computer engineering : Donald Knuth : TAoCP and its Influence of Computer Science : Richard Stallman : Linus Torvalds : Larry Wall : John K. Ousterhout : CTSS : Multix OS Unix History : Unix shell history : VI editor : History of pipes concept : Solaris : MS DOS : Programming Languages History : PL/1 : Simula 67 : C : History of GCC development : Scripting Languages : Perl history : OS History : Mail : DNS : SSH : CPU Instruction Sets : SPARC systems 1987-2006 : Norton Commander : Norton Utilities : Norton Ghost : Frontpage history : Malware Defense History : GNU Screen : OSS early history
Classic books:
The Peter Principle : Parkinson Law : 1984 : The Mythical Man-Month : How to Solve It by George Polya : The Art of Computer Programming : The Elements of Programming Style : The Unix Hater’s Handbook : The Jargon file : The True Believer : Programming Pearls : The Good Soldier Svejk : The Power Elite
Most popular humor pages:
Manifest of the Softpanorama IT Slacker Society : Ten Commandments of the IT Slackers Society : Computer Humor Collection : BSD Logo Story : The Cuckoo's Egg : IT Slang : C++ Humor : ARE YOU A BBS ADDICT? : The Perl Purity Test : Object oriented programmers of all nations : Financial Humor : Financial Humor Bulletin, 2008 : Financial Humor Bulletin, 2010 : The Most Comprehensive Collection of Editor-related Humor : Programming Language Humor : Goldman Sachs related humor : Greenspan humor : C Humor : Scripting Humor : Real Programmers Humor : Web Humor : GPL-related Humor : OFM Humor : Politically Incorrect Humor : IDS Humor : "Linux Sucks" Humor : Russian Musical Humor : Best Russian Programmer Humor : Microsoft plans to buy Catholic Church : Richard Stallman Related Humor : Admin Humor : Perl-related Humor : Linus Torvalds Related humor : PseudoScience Related Humor : Networking Humor : Shell Humor : Financial Humor Bulletin, 2011 : Financial Humor Bulletin, 2012 : Financial Humor Bulletin, 2013 : Java Humor : Software Engineering Humor : Sun Solaris Related Humor : Education Humor : IBM Humor : Assembler-related Humor : VIM Humor : Computer Viruses Humor : Bright tomorrow is rescheduled to a day after tomorrow : Classic Computer Humor
The Last but not Least Technology is dominated by two types of people: those who understand what they do not manage and those who manage what they do not understand ~Archibald Putt. Ph.D
Copyright © 1996-2021 by Softpanorama Society. www.softpanorama.org was initially created as a service to the (now defunct) UN Sustainable Development Networking Programme (SDNP) without any remuneration. This document is an industrial compilation designed and created exclusively for educational use and is distributed under the Softpanorama Content License. Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.
FAIR USE NOTICE This site contains copyrighted material the use of which has not always been specifically authorized by the copyright owner. We are making such material available to advance understanding of computer science, IT technology, economic, scientific, and social issues. We believe this constitutes a 'fair use' of any such copyrighted material as provided by section 107 of the US Copyright Law according to which such material can be distributed without profit exclusively for research and educational purposes.
This is a Spartan WHYFF (We Help You For Free) site written by people for whom English is not a native language. Grammar and spelling errors should be expected. The site contain some broken links as it develops like a living tree...
|
You can use PayPal to to buy a cup of coffee for authors of this site |
Disclaimer:
The statements, views and opinions presented on this web page are those of the author (or referenced source) and are not endorsed by, nor do they necessarily reflect, the opinions of the Softpanorama society. We do not warrant the correctness of the information provided or its fitness for any purpose. The site uses AdSense so you need to be aware of Google privacy policy. You you do not want to be tracked by Google please disable Javascript for this site. This site is perfectly usable without Javascript.
Last modified: March 12, 2019