Changes

Jump to: navigation, search

OPS245 Lab 4

3,745 bytes removed, 17:26, 21 September 2021
m
Practice For Quizzes, Tests, Midterm & Final Exam: - removing bash/getopts questions
[http://archive.linuxfromscratch.org/blfs-museum/1.0/BLFS-1.0/postlfs/skel.html /etc/skel]<br>
[http://zenit.senecac.on.ca/wiki/index.php/Init_vs_systemd init vs systemd]
<br><br>
Python Reference<br />
[https://docs.python.org/3/howto/argparse.html#conflicting-options argparse]
|}
# View the contents of the '''/home''' directory. Was the home directory for user '''ops245_2''' removed?
# Issue the following command to remove ops245_2's home directory: <b><code><span style="color:#3366CC;font-size:1.2em;">sudo rm -rf /home/ops245_2</span></code></b>
# Issue the '''userdel''' comamnd command to remove the '''ops245_1''' account with , but this time include the '''-r option''' (and to also remove the home directory regardless if it exists or not).
# Issue the useradd -m command to recreate the user called: '''ops245_1'''.
# Use the '''passwd''' command to set the password for the user '''ops245_1'''.
# View the <u>contents</u> for '''ops245_2's home directory''' and note the files. What do you notice that is different. What do you think is the purpose of the '''/etc/skel''' directory?
# Be sure to record your observations in your lab notes.
#Issue Look in the man pages for the '''useradd''' command. Explain the purpose of using the '''-e''' option for the ''useradd'' command.
#Issue the following command: <b><code><span style="color:#3366CC;font-size:1.2em;">sudo chage -E 2021-12-31 ops245_1</span></code></b>
#Issue the following command: <b><code><span style="color:#3366CC;font-size:1.2em;">sudo usermod -c "New Name" ops245_2</span></code></b>.
<ol>
<li>View (but do not edit) the contents of /etc/suduoerssudoers. Search for your user account. You won't find them.</li>
<li>Check the contents of /etc/passwd and /etc/group for entries with your user account. Is there anything different between your account and ops245_1?</li>
<li>You should find that your user is part of a secondary group. What group is it? Are they part of that group on centos3?</li>
Running Linux servers in graphical mode can make the server vulnerable to penetration (i.e. a potential break-in to the server from unauthorized intruders). The X-windows framework can be vulnerable to attacks when these servers are connected to the Internet. This is why when you install '''server versions''' of Linux, they work in text-based mode only. Desktop versions of Linux are then installed on workstations (working in graphical mode) that connect to the '''Linux server''' (for security reasons since those servers are closest to the router and the Internet).
The Linux sysadmin can also change the run-level target (or state) of a graphical Linux server to run in text-based mode and run the graphical mode by issuing a command when graphic mode is required. The You may also encounter this capability described as run-level levels, but that term is now deprecated in Fedora, and will likely be deprecated in /RHEL/CentOS at some point as well, but for now this is what the industry is using.
{| width="50%" align="right" cellpadding="10"
|- valign="top"
# Issue the following Linux command: <b><code><span style="color:#3366CC;font-size:1.2em;">systemctl get-default</span></code></b><br><br>'''Note:''' The output should read '''graphical.target'''
# Try the same command on your '''centos3''' VM and observe how the output differs. Go back to your '''centos3''' VM.
# You can use the '''systemctl isolate''' command to change the current run-leveltarget. See a list of runlevels targets [https://www.centos.org/docs/5/html/5.2/Installation_Guide/s2-init-boot-shutdown-rl.html here].# Change the current run-level target in '''centos1''' to '''multi-user.target''' by issuing the following command:<br><b><code><span style="color:#3366CC;font-size:1.2em;">sudo systemctl isolate multi-user.target</span></code></b>
# What did you notice?
# Reboot your '''centos1''' VM. It should return to the graphical login screen. You should notice at this point that the command '''systemctl isolate''' did not change the default target the system will boot to.
# Issue the <b><code><span style="color:#3366CC;font-size:1.2em;">sudo systemctl set-default multi-user.target</span></code></b> command (with elevated permissions) to change the current defatult run-level default target in '''centos1''' to '''multi-user.target''', then reboot your machine. What do you notice?
# Change the current run-level in '''centos1''' to '''graphical.target''' by issuing the following command:<br><b><code><span style="color:#3366CC;font-size:1.2em;">sudo systemctl isolate graphical.target</span></code></b>
# Try to do the same thing to your '''centos3''' VM. Did it work? Why or why not?
'''Answer INVESTIGATION 3 observations / questions in your lab log book.'''
= INVESTIGATION 4: CREATING USERS VIA USING ARGUMENTS IN SHELL SCRIPTS=
===Using argparse to Obtain Positional Arguments from the Command Line===
{|width="40%" align="right" cellpadding="10"|- valign="top"|{{Admon/tip|Bash Shell Scripting Tips:|<br>In this investigation we will use python'''T<u>he case statement</u>'''<ul><li>The case statement is a control-flow statement that works in a similar way as the if-elif-else statement (but is more concise). This statement presents scenerios or "cases" based on values or regular expressions (not ranges of values like if-elif-else statements).<br><br></li><li>After action(s) are taken for a particular scenerio (or "case"), a break statement (''';;''') is used argparse module to "break-out" of the statement (and not perform other actions). A default case (*) is also used to catch exceptions.<br><br></li><li>Examples:<br><br>''read -p "pick a door (1 or 2): " pick<br>case $pick in<br>&nbsp; 1) echo "You win a car!" ;;<br>&nbsp; 2) echo "You win a bag of dirt!" ;;<br>&nbsp; *) echo "Not a valid entry"<br>&nbsp;&nbsp;&nbsp;&nbsp; exit 1 ;;<br>esac''<br><br>''read -p "enter a single digit: " digit<br>case $digit in<br>&nbsp; [0-9]) echo "Your single digit is: $digit" ;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *)&nbsp;echo "not a valid single digit"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1 ;;<br>esac''<br><br></li></ul>'''<u>The getopts function</u>'''<ul><li>The getopts function allows the shell scripter to create make our scripts that accept options (like options for Linux commands). This provides the Linux administrator with scripts that provide more flexibility and versatility. A builtautomation-in function called '''getopts''' capable by reducing (i.e. get command options) is used in conjunction with a '''while''' loop and a '''case''' statement to carry out actions based on if certain options are present when the shell script is run.<br><br></li><li> The variable '''$OPTARG''' can be used if an option accepts text (denoted in the getopts function with an option letter followed by a colon. Case statement exceptions use the ''':or eliminating)''' and '''\?)''' cases for error handling.<br><br><li>Example:<br><br>''while getopts abc: name<br>do<br>&nbsp; case $name in<br>&nbsp; &nbsp; a) echo "Action for option \"a\"" ;;<br>&nbsp; &nbsp; b) echo "Action for option \"b\"" ;;<br>&nbsp; &nbsp; c) echo "Action for option \"c\""<br>&nbsp; &nbsp; &nbsp; &nbsp; echo Value is: $OPTARG" ;;<br>&nbsp; &nbsp; :) echo "Error: You how much interactivity we need text after -c option"<br>&nbsp; &nbsp; &nbsp; &nbsp; exit 1 ;;<br>&nbsp; &nbsp; \?) echo "Error: Incorrect option"<br>&nbsp; &nbsp; &nbsp; &nbsp; exit 1 ;;<br>esac''<br>done<br><br></li></ul>}}|}===Using getopts Function &amp; case statement=== We will now use shell scripting to help automate from the task for a Linux adminstrator to create regular user accounts.
:'''Perform the following steps:'''
#<ol><li>You will be using your '''c7host''' machine for this section.</li>#Open a shell terminal, and login as root.#<li>Change to the your '''/root/bin''' directory.</li>#Download<li>Use your tarchiver.py command (from lab 3) to make a tar archive of /tmp called mytmp.tar.<br />You'll notice that even after hitting enter to run the command, you still needed to give more data to your script (to tell it which directory you wanted to archive, studywhat to call it, and what compression to use). <br />Requiring this much interaction from the user means that this script is not very good for automation. We can't schedule this script to automatically run , because we (or another admin) need to be present to type answers to the prompts.</li><li>Make a copy of your tarchiver.py script and call it tarchiver2.py. We will work with tarchiver2.py for the rest of this investigation.</li><li>Import the argparse module into tarchiver2.py.</li><li>Add the following shell lines to your script, after the import, but before you prompt the user for anything:<br /><code>parser = argparse. Issue ArgumentParser()<br/>args = parser.parse_args()</code><br />This creates an argument parser and makes it read all the commandline arguments the user entered. However, we haven't defined any that we expect yet, so all this will do is display a default help message if the user runs our script with -h.</li><li>Try that now:<br/><bcode>tarchiver2.py -h</code><span style/li><li>For argparse to be really useful, we need to tell it to expect some command line arguments (and then do something with them).<br />Modify your script so the argparse portion of it looks like this:<br /><code>parser = argparse.ArgumentParser()<br/>parser.add_argument("dest",help="cursorThe name you would like to give the archive.")<br />args = parser.parse_args()</code><br />And replace the line where you prompt the user for the destination archive name with:default;color<br /><code>destination = args.dest</code><br />Note:#3366CC;font-size:1 Instead of '''destination''', use the variable name were already using to store the value you were getting from the user. That way you won't have to change it in the rest of your script.</li><li>Try using your script to make another archived copy of /tmp, this time calling it secondtmp.tar.2em;"<br />wget httpsIf you didn't provide secondtmp.tar on the command line when you ran the command, you'll notice that your script complained. Try running:<br //ict><code>tarchiver.senecacollegepy secondtmp.catar</~ops235code></labsli><li>You should still be getting prompted about the directory you want to archive, and whether or not you want compression, but you are now telling the script that the created archive should be called secondtmp.tar.</li><li>Run the script again, but this time give the archive a different name of your own choice. Your script is part way to being automatable: the user-createcan set the name of the created archive before the script runs. We just need to make this possible for the rest of the required data.bash</spanli><li>Add a second parser.add_argument line to your script so that you can also obtain the name of the directory to archive from the command line. You can choose if it should go before or after the name of the archive. Just remember to use a different argument name, and an appropriate help message.</li><li>Replace the line in your script that prompts the user for the name of the directory with codethat will retrieve the value the user entered on the command line.</li><li>Run you script to make sure it works.<br /b>#Try You should now be able to enter both the directory to understand what these Bash Shell scripts doarchive, and the name of the resulting archive on the command line, and then run should only be prompted about compression.</li><li>All that is left to finish the script as root is to create just replace the prompts for compression with command line options. You could do this by adding a third argument and requiring it to include a compression type, or by creating a mutually exclusive group with three arguments in it (one user called for each compression type). Neither of these is more '''testcorrect'''than the other. After running Pick which one you would like to try and finish the shell scriptwith it.</li><li>When you are finished, you should be able to specify the directory to archive, view the contents name of the '''/home''' directory archive to confirmcreate, and the compression type (if any) from the command line. The user should no longer be prompted for anything after hitting <code>&lt;enter&gt;</code></li></ol>
Although the '''zenity''' command is a "user-friendly" way to run shell scripts, Linux administrators usually create shell scripts that resemble common Linux commands. In this lab, you will learn to create a shell script using the getopts function to make your shell script behave more like actual Linux commands (including the use of options). Refer to the notes section on the right-hand-side for reference about the '''case''' statement and the '''getopts''' function.  <ol><li value="6">Open a Bash shell terminal and login as root.</li><li>Change to the '''/root/bin''' directory.</li><li>Use the wget command to download the input file called user-data.txt by issuing the command:<br><b><code><span style="color:#3366CC;font-size:1.2em;">wget https://ict.senecacollege.ca/~ops235/labs/user-data.txt</span></code></b></li><li>View the contents on the user-data.txt file to confirm there are 3 fields (username, fullname, and e-mail address)which are separated by the colon (:) symbol.</li><li>Use a text editor (such as <b><code><span style="color:#3366CC;font-size:1.2em;">vi</span></code></b> or <b><code><span style="color:#3366CC;font-size:1.2em;">nano</span></code></b>) to create a Bash Shell script called: <b><code><span style="color:#3366CC;font-size:1.2em;">createUsers.bash</span></code></b> in the /root/bin directory.</li><li>Enter the following text content into your text-editing session:</li></ol><code style="color:#3366CC;font-family:courier;font-size:.9em;margin-left:20px;font-weight:bold;"><br>&#35;!/bin/bash <br><br>&#35; createUsers.bash<br>&#35; Purpose: Generates a batch of user accounts (user data stored in a text file)<br>&#35;<br>&#35; USAGE: /root/createUsers.bash [-i {input-path}] <br>&#35;<br>&#35; Author: *** INSERT YOUR NAME ***<br>&#35; Date: *** CURRENT DATE ***<br><br>&#35; Make certain user is logged in as root<br>if [ $USER != "root" ]<br>then<br>&nbsp; &nbsp;echo "Note: You are required to run this program as root."<br>&nbsp; &nbsp;exit 1<br>fi<br><br>if [ "$#" -eq 0 ] # if no arguments after command<br>then<br>&nbsp;echo "You must enter an argument" >&2<br>&nbsp;echo "USAGE: $0 [-i {input-path}]" >&2<br>&nbsp;exit 2<br>fi<br></code><br><ol><li value="12">Save your editing session, but remain in the text editor.</li><li>The code displayed below uses the getopt function set the input file pathname or check for invalid options or missing option text. Add the following code</li></ol><br><code style="color:#3366CC;font-family:courier;font-size:.9em;font-weight:bold;"><br>outputFlag="n"<br>while getopts i: name<br>do<br>&nbsp;case $name in<br>&nbsp; &nbsp;i) inputFile=$OPTARG ;;<br>&nbsp; &nbsp;:) echo "Error: You need text after options requiring text"<br>&nbsp; &nbsp; &nbsp; &nbsp;exit 1 ;;<br>&nbsp; &nbsp;\?) echo "Error: Incorrect option"<br>&nbsp; &nbsp; &nbsp; &nbsp; exit 1 ;;<br>&nbsp;esac<br>done<br></code><ol><li value="14">Save your editing session, but remain in the text editor.</li><li>The code displayed below uses logic to exit the script if the input file does not exist. Command substitution is used to store each line of the input file as a positional parameter. There is one subtle problem here: The full names of the users contain spaces which can create havoc when trying to set each line as a separate positional parameter. In this case the sed command is used to convert spaces to plus signs (+), which will be converted back later. Finally, a '''for''' loop is used to create each account ('''useradd''') and mail the user their account information ('''mail'''). Add the following code:</li></ol><br><code style="color:#3366CC;font-family:courier;font-size:.9em;font-weight:bold;"><br>if [ ! -f $inputFile ]<br>then<br>&nbsp; echo "The file pathname \"$inputFile\" is empty or does not exist" >&2<br>&nbsp; exit 2<br>fi<br><br>set $(sed 's/ /+/g' $inputFile) # temporarily convert spaces to + for storing lines as positional parameters<br><br>for x<br>do<br>&nbsp; &nbsp; userPassWd=$(date | md5sum | cut -d" " -f1)<br>&nbsp; &nbsp; useradd -m -c "$(echo $x | cut -d":" -f2 | sed 's/+/ /g')" -p $userPassWd $(echo $x | cut -d":" -f1)<br>&nbsp; &nbsp; mail -s "Server Account Information" $(echo $x | cut -d":" -f3) <<+<br>&nbsp; &nbsp; Here is your server account information:<br>&nbsp; &nbsp; servername: myserver.senecac.on.ca<br>&nbsp; &nbsp; username: $(echo $x | cut -d":" -f1)<br>&nbsp; &nbsp; password: $userPassWd<br>&nbsp; &nbsp; Regards,<br>&nbsp; &nbsp; IT Department<br>+<br>done<br><br>echo -e "\n\nAccounts have been created\n\n"<br>exit 0<br></code> <ol><li value="16">Save, set permissions, and then run that shell script for the input text file '''user-data.txt'''. Did it work? Try running the script without an argument - What did it do? </li><li>You have completed lab4. Proceed to Completing The Lab, and follow the instructions for "lab sign-off".</li></ol>
'''Answer INVESTIGATION 4 observations / questions in your lab log book.'''
# Switch to your '''c7host''' VM.
# Open a shell terminal, enter a root session, and change to the '''/root/bin''' directory.
# Issue the Linux command: <b><code><span style="color:#3366CC;font-size:1.2em;">wget https://ict.senecacollege.ca/~peter.callaghan/ops245/labs/lab4-check.bash</span></code></b>
# Give the '''lab4-check.bash''' file execute permissions (for the file owner).
# Run the shell script and if any warnings, make fixes and re-run shell script until you receive "congratulations" message.
#Arrange proof of the following on the screen:<br><span style="color:green;font-size:1.5em;">&#x2713;</span> '''centos1''' VM:<blockquote><ul><li>Demonstrate that this VM 's current run-level is set to '''5'''.</ul></blockquote><span style="color:green;font-size:1.5em;">&#x2713;</span>'''c7host''' machine<blockquote><ul><li>Run the '''lab4-check.bash''' script (must have all <b><code><span style="color:#66cc00;border:thin solid black;font-size:1.2em;">&nbsp;OK&nbsp;</span></code></b> messages)</li></ul></blockquote><span style="color:green;font-size:1.5em;">&#x2713;</span> '''Lab4''' log-book filled out.
#Take a screenshot of the proof in the previous step, and upload it , your tarchiver2.py script, your log book, and the file generated by '''lab4-check.bash''' to blackboard.
= Practice For Quizzes, Tests, Midterm &amp; Final Exam =
# What is the difference between '''starting''' a service and '''enabling''' a service?
# Can a service be stopped and started by issuing just one command?
# What is the purpose of the '''case''' statement in shell scripting?
# What is the purpose of the '''getopts''' function in shell scripting?
# What type of shell script would be best to automatically create 1200 user accounts (which a list of usernames are stored in a text-file)?
[[Category:OPS245]]
932
edits

Navigation menu