/ Linux Reviews / Beginners: Learn Linux / Advanced Bash-Scripting Guide - en
12.6. Communications CommandsCertain of the following commands find use in chasing spammers, as well as in
network data transfer and analysis. Information and Statistics - host
Searches for information about an Internet host by name or
IP address, using DNS. bash$ host surfacemail.com
surfacemail.com. has address 202.92.42.236
- ipcalc
Displays IP information for a host.
With the -h option,
ipcalc does a reverse DNS lookup, finding
the name of the host (server) from the IP address. bash$ ipcalc -h 202.92.42.236
HOSTNAME=surfacemail.com
- nslookup
Do an Internet "name server lookup"
on a host by IP address. This is essentially equivalent
to ipcalc -h or dig -x
. The command may be run either interactively
or noninteractively, i.e., from within a script. The nslookup command has allegedly
been "deprecated," but it still has its
uses. bash$ nslookup -sil 66.97.104.180
nslookup kuhleersparnis.ch
Server: 135.116.137.2
Address: 135.116.137.2#53
Non-authoritative answer:
Name: kuhleersparnis.ch
- dig
Domain Information
Groper. Similar to
nslookup, dig does
an Internet "name server lookup" on a host.
May be run either interactively or noninteractively, i.e.,
from within a script. Some interesting options to dig are
+time=N for setting a query timeout to
N seconds, +nofail for
continuing to query servers until a reply is received, and
-x for doing a reverse address lookup. Compare the output of dig -x with
ipcalc -h and
nslookup. bash$ dig -x 81.9.6.2
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 11649
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;2.6.9.81.in-addr.arpa. IN PTR
;; AUTHORITY SECTION:
6.9.81.in-addr.arpa. 3600 IN SOA ns.eltel.net. noc.eltel.net.
2002031705 900 600 86400 3600
;; Query time: 537 msec
;; SERVER: 135.116.137.2#53(135.116.137.2)
;; WHEN: Wed Jun 26 08:35:24 2002
;; MSG SIZE rcvd: 91
Example 12-36. Checking a spam domain #! /bin/bash
# is-spammer.sh: Identifying spam domains
# $Id: is-spammer, v 1.4 2004/09/01 19:37:52 mszick Exp $
# Above line is RCS ID info.
#
# This is a simplified version of the "is_spammer.bash
#+ script in the Contributed Scripts appendix.
# is-spammer <domain.name>
# Uses an external program: 'dig'
# Tested with version: 9.2.4rc5
# Uses functions.
# Uses IFS to parse strings by assignment into arrays.
# And even does something useful: checks e-mail blacklists.
# Use the domain.name(s) from the text body:
# http://www.good_stuff.spammer.biz/just_ignore_everything_else
# ^^^^^^^^^^^
# Or the domain.name(s) from any e-mail address:
# Really_Good_Offer@spammer.biz
#
# as the only argument to this script.
#(PS: have your Inet connection running)
#
# So, to invoke this script in the above two instances:
# is-spammer.sh spammer.biz
# Whitespace == :Space:Tab:Line Feed:Carriage Return:
WSP_IFS=$'\x20'$'\x09'$'\x0A'$'\x0D'
# No Whitespace == Line Feed:Carriage Return
No_WSP=$'\x0A'$'\x0D'
# Field separator for dotted decimal ip addresses
ADR_IFS=${No_WSP}'.'
# Get the dns text resource record
# get_txt <error_code> <list_query>
get_txt() {
# parse $1 by assignment at the dots
local -a dns
IFS=$ADR_IFS
dns=( $1 )
IFS=$WSP_IFS
if [ "${dns[0]}" == '127' ]
then
# see if there is a reason
echo $(dig +short $2 -t txt)
fi
}
# Get the dns address resource record
# chk_adr <rev_dns> <list_server>
chk_adr() {
local reply
local server
local reason
server=${1}${2}
reply=$( dig +short ${server} )
# if reply might be an error code . . .
if [ ${#reply} -gt 6 ]
then
reason=$(get_txt ${reply} ${server} )
reason=${reason:-${reply}}
fi
echo ${reason:-' not blacklisted.'}
}
# Need to get the IP address from the name.
echo 'Get address of: '$1
ip_adr=$(dig +short $1)
dns_reply=${ip_adr:-' no answer '}
echo ' Found address: '${dns_reply}
# A valid reply is at least 4 digits plus 3 dots.
if [ ${#ip_adr} -gt 6 ]
then
echo
declare query
# Parse by assignment at the dots.
declare -a dns
IFS=$ADR_IFS
dns=( ${ip_adr} )
IFS=$WSP_IFS
# Reorder octets into dns query order.
rev_dns="${dns[3]}"'.'"${dns[2]}"'.'"${dns[1]}"'.'"${dns[0]}"'.'
# See: http://www.spamhaus.org (Conservative, well maintained)
echo -n 'spamhaus.org says: '
echo $(chk_adr ${rev_dns} 'sbl-xbl.spamhaus.org')
# See: http://ordb.org (Open mail relays)
echo -n ' ordb.org says: '
echo $(chk_adr ${rev_dns} 'relays.ordb.org')
# See: http://www.spamcop.net/ (You can report spammers here)
echo -n ' spamcop.net says: '
echo $(chk_adr ${rev_dns} 'bl.spamcop.net')
# # # other blacklist operations # # #
# See: http://cbl.abuseat.org.
echo -n ' abuseat.org says: '
echo $(chk_adr ${rev_dns} 'cbl.abuseat.org')
# See: http://dsbl.org/usage (Various mail relays)
echo
echo 'Distributed Server Listings'
echo -n ' list.dsbl.org says: '
echo $(chk_adr ${rev_dns} 'list.dsbl.org')
echo -n ' multihop.dsbl.org says: '
echo $(chk_adr ${rev_dns} 'multihop.dsbl.org')
echo -n 'unconfirmed.dsbl.org says: '
echo $(chk_adr ${rev_dns} 'unconfirmed.dsbl.org')
else
echo
echo 'Could not use that address.'
fi
exit 0
# Exercises:
# --------
# 1) Check arguments to script,
# and exit with appropriate error message if necessary.
# 2) Check if on-line at invocation of script,
# and exit with appropriate error message if necessary.
# 3) Substitute generic variables for "hard-coded" BHL domains.
# 4) Set a time-out for the script using the "+time=" option
to the 'dig' command.For a much more elaborate version of the above script, see
Example A-27. - traceroute
Trace the route taken by packets sent to a remote host. This
command works within a LAN, WAN, or over the
Internet. The remote host may be specified by an IP
address. The output of this command may be filtered
by grep or sed in a pipe. bash$ traceroute 81.9.6.2
traceroute to 81.9.6.2 (81.9.6.2), 30 hops max, 38 byte packets
1 tc43.xjbnnbrb.com (136.30.178.8) 191.303 ms 179.400 ms 179.767 ms
2 or0.xjbnnbrb.com (136.30.178.1) 179.536 ms 179.534 ms 169.685 ms
3 192.168.11.101 (192.168.11.101) 189.471 ms 189.556 ms *
...
- ping
Broadcast an "ICMP ECHO_REQUEST" packet to
another machine, either on a local or remote network. This
is a diagnostic tool for testing network connections,
and it should be used with caution. A successful ping returns an exit status of
0. This can be tested for in a
script. bash$ ping localhost
PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=255 time=709 usec
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=255 time=286 usec
--- localhost.localdomain ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/mdev = 0.286/0.497/0.709/0.212 ms
- whois
Perform a DNS (Domain Name System) lookup.
The -h option permits specifying which
particular whois server to query. See
Example 4-6. - finger
Retrieve information about users on a
network. Optionally, this command can display
a user's ~/.plan,
~/.project, and
~/.forward files, if present. bash$ finger
Login Name Tty Idle Login Time Office Office Phone
bozo Bozo Bozeman tty1 8 Jun 25 16:59
bozo Bozo Bozeman ttyp0 Jun 25 16:59
bozo Bozo Bozeman ttyp1 Jun 25 17:07
bash$ finger bozo
Login: bozo Name: Bozo Bozeman
Directory: /home/bozo Shell: /bin/bash
Office: 2355 Clown St., 543-1234
On since Fri Aug 31 20:13 (MST) on tty1 1 hour 38 minutes idle
On since Fri Aug 31 20:13 (MST) on pts/0 12 seconds idle
On since Fri Aug 31 20:13 (MST) on pts/1
On since Fri Aug 31 20:31 (MST) on pts/2 1 hour 16 minutes idle
No mail.
No Plan.
Out of security considerations, many networks disable
finger and its associated daemon.
- chfn
Change information disclosed by the
finger command. - vrfy
Verify an Internet e-mail address.
Remote Host Access - sx, rx
The sx and rx
command set serves to transfer files to and from a remote
host using the xmodem protocol. These
are generally part of a communications package, such as
minicom. - sz, rz
The sz and rz
command set serves to transfer files to and from a remote
host using the zmodem protocol.
Zmodem has certain advantages over
xmodem, such as faster transmission
rate and resumption of interrupted file transfers.
Like sx and rx,
these are generally part of a communications package. - ftp
Utility and protocol for uploading / downloading
files to or from a remote host. An ftp session can be automated
in a script (see Example 17-6, Example A-4, and Example A-13). - uucp
UNIX to UNIX copy. This is a
communications package for transferring files between UNIX
servers. A shell script is an effective way to handle a
uucp command sequence. Since the advent of the Internet and e-mail,
uucp seems to have faded into obscurity,
but it still exists and remains perfectly workable in
situations where an Internet connection is not available
or appropriate. - cu
Call Up
a remote system and connect as a simple terminal. This
command is part of the uucp package. It
is a sort of dumbed-down version of telnet. - telnet
Utility and protocol for connecting to a remote host.  | The telnet protocol contains security holes and
should therefore probably be avoided. |
- wget
The wget utility
non-interactively retrieves or
downloads files from a Web or ftp site. It works well in a
script.
wget -p http://www.xyz23.com/file01.html
wget -r ftp://ftp.xyz24.net/~bozo/project_files/ -O $SAVEFILE
Example 12-37. Getting a stock quote #!/bin/bash
# quote-fetch.sh: Download a stock quote.
E_NOPARAMS=66
if [ -z "$1" ] # Must specify a stock (symbol) to fetch.
then echo "Usage: `basename $0` stock-symbol"
exit $E_NOPARAMS
fi
stock_symbol=$1
file_suffix=.html
# Fetches an HTML file, so name it appropriately.
URL='http://finance.yahoo.com/q?s='
# Yahoo finance board, with stock query suffix.
# -----------------------------------------------------------
wget -O ${stock_symbol}${file_suffix} "${URL}${stock_symbol}"
# -----------------------------------------------------------
# To look up stuff on http://search.yahoo.com:
# -----------------------------------------------------------
# URL="http://search.yahoo.com/search?fr=ush-news&p=${query}"
# wget -O "$savefilename" "${URL}"
# -----------------------------------------------------------
# Saves a list of relevant URLs.
exit $?
# Exercises:
# ---------
#
# 1) Add a test to ensure the user running the script is on-line.
# (Hint: parse the output of 'ps -ax' for "ppp" or "connect."
#
# 2) Modify this script to fetch the local weather report,
#+ taking the user's zip code as an argument.See also Example A-28 and Example A-29. - lynx
The lynx Web and file browser
can be used inside a script (with the
-dump option) to retrieve a file from a Web or
ftp site non-interactively.
lynx -dump http://www.xyz23.com/file01.html >$SAVEFILE
With the -traversal option,
lynx starts at the HTTP URL specified
as an argument, then "crawls" through all
links located on that particular server. Used together
with the -crawl option, outputs page text
to a log file. - rlogin
Remote login, initates a
session on a remote host. This command has security issues,
so use ssh instead. - rsh
Remote shell, executes
command(s) on a remote host. This has security issues,
so use ssh instead. - rcp
Remote copy, copies files
between two different networked machines. Using
rcp and similar utilities with
security implications in a shell script may not be
advisable. Consider, instead, using ssh
or an expect script. - ssh
Secure shell, logs onto
a remote host and executes commands there. This
secure replacement for telnet,
rlogin, rcp, and
rsh uses identity authentication
and encryption. See its manpage
for details. Example 12-38. Using ssh #!/bin/bash
# remote.bash: Using ssh.
# This example by Michael Zick.
# Used with permission.
# Presumptions:
# ------------
# fd-2 isn't being captured ( '2>/dev/null' ).
# ssh/sshd presumes stderr ('2') will display to user.
#
# sshd is running on your machine.
# For any 'standard' distribution, it probably is,
#+ and without any funky ssh-keygen having been done.
# Try ssh to your machine from the command line:
#
# $ ssh $HOSTNAME
# Without extra set-up you'll be asked for your password.
# enter password
# when done, $ exit
#
# Did that work? If so, you're ready for more fun.
# Try ssh to your machine as 'root':
#
# $ ssh -l root $HOSTNAME
# When asked for password, enter root's, not yours.
# Last login: Tue Aug 10 20:25:49 2004 from localhost.localdomain
# Enter 'exit' when done.
# The above gives you an interactive shell.
# It is possible for sshd to be set up in a 'single command' mode,
#+ but that is beyond the scope of this example.
# The only thing to note is that the following will work in
#+ 'single command' mode.
# A basic, write stdout (local) command.
ls -l
# Now the same basic command on a remote machine.
# Pass a different 'USERNAME' 'HOSTNAME' if desired:
USER=${USERNAME:-$(whoami)}
HOST=${HOSTNAME:-$(hostname)}
# Now excute the above command line on the remote host,
#+ with all transmissions encrypted.
ssh -l ${USER} ${HOST} " ls -l "
# The expected result is a listing of your username's home
#+ directory on the remote machine.
# To see any difference, run this script from somewhere
#+ other than your home directory.
# In other words, the Bash command is passed as a quoted line
#+ to the remote shell, which executes it on the remote machine.
# In this case, sshd does ' bash -c "ls -l" ' on your behalf.
# For information on topics such as not having to enter a
#+ password/passphrase for every command line, see
#+ man ssh
#+ man ssh-keygen
#+ man sshd_config.
exit 0 | Within a loop, ssh may cause
unexpected behavior. According to a Usenet post in the comp.unix shell archives,
ssh inherits the loop's
stdin. To remedy this, pass
ssh either the -n
or -f option. Thanks, Jason Bechtel, for pointing this out. |
Local Network - write
This is a utility for terminal-to-terminal communication.
It allows sending lines from your terminal (console or
xterm) to that of another user. The
mesg command may, of course,
be used to disable write access to a terminal Since write is interactive, it
would not normally find use in a script. - netconfig
A command-line utility for configuring a network adapter
(using DHCP). This command is native to Red Hat centric Linux
distros.
Mail - mail
Send or read e-mail messages. This stripped-down command-line mail client
works fine as a command embedded in a script. Example 12-39. A script that mails itself #!/bin/sh
# self-mailer.sh: Self-mailing script
adr=${1:-`whoami`} # Default to current user, if not specified.
# Typing 'self-mailer.sh wiseguy@superdupergenius.com'
#+ sends this script to that addressee.
# Just 'self-mailer.sh' (no argument) sends the script
#+ to the person invoking it, for example, bozo@localhost.localdomain.
#
# For more on the ${parameter:-default} construct,
#+ see the "Parameter Substitution" section
#+ of the "Variables Revisited" chapter.
# ============================================================================
cat $0 | mail -s "Script \"`basename $0`\" has mailed itself to you." "$adr"
# ============================================================================
# --------------------------------------------
# Greetings from the self-mailing script.
# A mischievous person has run this script,
#+ which has caused it to mail itself to you.
# Apparently, some people have nothing better
#+ to do with their time.
# --------------------------------------------
echo "At `date`, script \"`basename $0`\" mailed to "$adr"."
exit 0- mailto
Similar to the mail command,
mailto sends e-mail messages
from the command line or in a script. However,
mailto also permits sending MIME
(multimedia) messages. - vacation
This utility automatically replies to e-mails that
the intended recipient is on vacation and temporarily
unavailable. This runs on a network, in conjunction with
sendmail, and is not applicable to a
dial-up POPmail account.
/ Linux Reviews / Beginners: Learn Linux / Advanced Bash-Scripting Guide
|
Meet new people
Adult Dating
|