设为首页 收藏本站
查看: 821|回复: 0

10 Tools To Add Some Spice To Your UNIX Shell Scripts

[复制链接]

尚未签到

发表于 2017-5-16 09:12:39 | 显示全部楼层 |阅读模式
DSC0000.png

  T
here are some misconceptions that
shell scripts are only for a CLI environment. You can easily use various
tools to write GUI and/or network (socket) scripts under KDE or Gnome
desktops. Shell scripts can make use of some of the GUI widget (menus,
warning boxs, progress bars etc). You can always control the final
output, cursor position on screen, various output effects, and so on.
With the following tools you can build powerful, interactive, user
friendly UNIX / Linux bash shell scripts.

DSC0001.gif

  Creating GUI application is not just expensive task but task that
takes time and patience. Luckily, both UNIX and Linux ships with plenty
of tools to write beautiful GUI scripts.  The following tools are tested
on FreeBSD and Linux operating systems but should work under other UNIX
like operating systems.

#1: notify-send Command
  The notify-send command allows you to send desktop notifications to
the user via a notification daemon from the command line. This is useful
to inform the desktop user about an event or display some form of
information without getting in the user's way. You need to install the
following package:
$ sudo apt-get install libnotify-bin


In this example, send simple desktop notification from the command line, enter:

 
notify-send "rsnapshot done :)"
 
  Sample outputs:


Fig:01: notify-send in action





Here is another code with additional options:
 
....
alert=
18000
live=
$(
lynx
--dump http://money.rediff.com/ | grep
'BSE LIVE'
| awk
'{ print $5}'
| sed
's/,//g;s/\.
[0-9]*//g'

)
[
$notify_counter
-eq 0
]
&& [
$live
-ge $alert
]
&& {
notify-send -t 5000
-u low -i   "BSE Sensex touched 18k"
;  notify_counter=
1
; }
...
  Sample outputs:


Fig.02: notify-send with timeouts and other options





Where,

  • -t 5000: Specifies  the  timeout  in  milliseconds ( 5000 milliseconds = 5 seconds)
  • -u low : Set the urgency level  (i.e. low,  normal, or critical).
  • -i gtk-dialog-info :  Set an icon filename or stock icon to display (you can set path as -i /path/to/your-icon.png).
  For more information on use of the notify-send utility, please refer
to the notify-send man page, viewable by typing man notify-send from the
command line:
man notify-send


#2: tput Command
  The tput command is used to set terminal features. With tput you can set:


  • Move the cursor around the screen.
  • Get information about terminal.
  • Set colors (background and foreground).
  • Set bold mode.
  • Set reverse mode and much more.
  Here is a sample code:

#!/bin/bash
 
# clear
the screen

tput clear
 
# Move cursor to screen location X,Y (
top left is 0
,0
)

tput cup 3
15
 
# Set a foreground colour using ANSI escape
tput setaf 3
echo
"XYX Corp LTD."
tput sgr0
 
tput cup 5
17
# Set reverse video mode
tput rev
echo
"M A I N - M E N U"
tput sgr0
 
tput cup 7
15
echo
"1. User Management"
 
tput cup 8
15
echo
"2. Service Management"
 
tput cup 9
15
echo
"3. Process Management"
 
tput cup 10
15
echo
"4. Backup"
 
# Set bold mode
tput bold
tput cup 12
15
read
-p "Enter your choice [1-4] "
choice
 
tput clear
tput sgr0
tput rc
  Sample outputs:


Fig.03: tput in action





For more detail concerning the tput command, see the following man page:
man 5 terminfo

man tput
#3: setleds Command
  The setleds command allows you to set the keyboard leds. In this example, set NumLock on:

setleds
-D +num
  To turn it off NumLock, enter:

setleds
-D -num

  • -caps  : Clear CapsLock.
  • +caps : Set  CapsLock.
  • -scroll : Clear ScrollLock.
  • +scroll : Set ScrollLock.
  See setleds command man page for more information and options:
man setleds


#4: zenity Command
  The zenity commadn will display GTK+ dialogs box, and return the
users input. This allows you to present information, and ask for
information from the user, from all manner of shell scripts. Here is a
sample GUI client for the whois directory service for given domain name:

#!/bin/bash
# Get domain name
_zenity=
"/usr/bin/zenity"
_out=
"/tmp/whois.output.$$"
domain=
$(
${
_zenity}

--title  "Enter domain"
\
--entry --text "Enter the domain you would like to see whois info"
)
 
if
[
$? -eq 0
]
then
# Display a progress dialog while
searching whois database

whois $domain
| tee
>(
${
_zenity}

--width=
200
--height=
100
\
--title=
"whois"
--progress \
--pulsate --text=
"Searching domain info..."
\
--auto-kill
--auto-close \
--percentage=
10
)
>${
_out}

 
# Display back output
${
_zenity}

--width=
800
--height=
600
\
--title "Whois info for $domain"
\
--text-info --filename=
"${_out}"
else
${
_zenity}

--error \
--text=
"No input provided"
fi

  Sample outputs:


Fig.04: zenity in Action





See the zenity man page for more information and all other supports GTK+ widgets:
zenity --help

man zenity
#5: kdialog Command
  kdialog is just like zenity but it is designed for KDE desktop / qt
apps. You can display dialogs using kdialog. The following will display
message on screen:

 
kdialog
--dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."
 
  Sample outputs:


Fig.05: Suppressing the display of a dialog


  See shell scripting with KDE Dialogs
tutorial for more information.

#6: Dialog
  Dialog is an application used in shell scripts which displays text
user interface widgets. It uses the curses or ncurses library. Here is a
sample code:

>#!/bin/bash
dialog --title "Delete file"
\
--backtitle "Linux Shell Script Tutorial Example"
\
--yesno "Are you sure you want to permanently delete \"
/tmp/foo.txt\"
?"

7
60
 
# Get exit
status

# 0
means user hit [
yes
]
button.

# 1
means user hit [
no]
button.

# 255
means user hit [
Esc]
key.

response=
$?
case
$response
in
0
)
echo
"File deleted."
;;
1
)
echo
"File not deleted."
;;
255
)
echo
"[ESC] key pressed."
;;
esac

  See the dialog man page for details:
man dialog


A Note About Other User Interface Widgets Tools
  UNIX and Linux comes with lots of other tools to display and control
apps from the command line, and shell scripts can make use of some of
the KDE / Gnome / X widget set:



  • gmessage
    - a GTK-based xmessage clone.

  • xmessage
    -  display a message or query in a window (X-based /bin/echo)

  • whiptail
    - display dialog boxes from shell scripts

  • python-dialog
    - Python module for making simple Text/Console-mode user interfaces

#7: logger command
  The logger command writes entries in the system log file such as
/var/log/messages. It provides a shell command interface to the syslog
system log module:

 
logger "MySQL database backup failed."
tail
-f /var/log/messages
logger -t mysqld -p daemon.error "Database Server failed"
tail
-f /var/log/syslog
 
  Sample outputs:

Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal
Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed
  See howto write message to a syslog / log file
for more information. Alternatively, you can see the logger man page for details:
man logger


#8: setterm Command
  The setterm command can set various terminal attributes. In this
example, force screen to turn black in 15 minutes. Monitor standby will
occur at 60 minutes:

 
setterm
-blank 15
-powersave powerdown -powerdown 60
 
  In this example show underlined text for xterm window:

 
setterm
-underline on;
echo
"Add Your Important Message Here"
setterm
-underline off
 
  Another useful option is to turn on or off cursor:

 
setterm
-cursor off
 
  Turn it on:

 
setterm
-cursor on
 
  See the setterm command man page for details:
man setterm


#9: smbclient: Sending Messages To MS-Windows Workstations
  The smbclient command can talk to an SMB/CIFS server. It can send a
message to selected users or all users on MS-Windows systems:

smbclient -M WinXPPro <<EOF
Message 1
Message 2
...
..
EOF
  OR

 
echo
"${Message}"
| smbclient -M salesguy2
 
  See smbclient man page or read our previous post about "sending a message to Windows Workstation"
with smbclient command:
man smbclient


#10: Bash Socket Programming
  Under bash you can open a socket to pass some data through it. You
don't have to use curl or lynx commands to just grab data from remote
server. Bash comes with two special device files which can be used to
open network sockets. From the bash man page:



  • /dev/tcp/host/port
    - If host is a valid hostname or
    Internet address, and port is an integer port number or service name,
    bash attempts  to  open  a  TCP connection to the corresponding socket.

  • /dev/udp/host/port
    - If  host  is  a  valid
    hostname or Internet address, and port is an integer port number or
    service name, bash attempts to open a UDP connection to the
    corresponding socket.
  You can use this technquie to dermine if port is open or closed on
local or remote server without using nmap or other port scanner:

# find
out if
TCP port 25
open or not

(
echo
>/dev/tcp/localhost/25
)
&>/dev/null && echo
"TCP port 25 open"
|| echo
"TCP port 25 close"

  You can use bash loop and find out open ports
with the snippets:

 
echo
"Scanning TCP ports..."
for
p in
{
1
..1023
}
do
(
echo
>/dev/tcp/localhost/$p
)
>/dev/null 2
>&1
&& echo
"$p open"
done

  Sample outputs:

Scanning TCP ports...
22 open
53 open
80 open
139 open
445 open
631 open
  In this example, your bash script act as an HTTP client:

#!/bin/bash
exec
3
<> /dev/tcp/${
1
:-www.cyberciti.biz}
/80
 
printf
"GET / HTTP/1.0\r
\n
"

>&3
printf
"Accept: text/html, text/plain\r
\n
"

>&3
printf
"Accept-Language: en\r
\n
"

>&3
printf
"User-Agent: nixCraft_BashScript v.%s\r
\n
"

"${BASH_VERSION}"
>&3
printf
"\r
\n
"

>&3
 
while
read
LINE <&3
do
# do
something on $LINE

# or send $LINE
to grep
or awk
for
grabbing data

# or simply display back data with echo
command

echo
$LINE
done

  See the bash man page for more information:
man bash


A Note About GUI Tools and Cronjob
  You need to request local display/input service using export DISPLAY=[user's machine]:0 command if you are using cronjob
to call your scripts. For example, call /home/vivek/scripts/monitor.stock.sh as follows which uses zenity tool:
@hourly  DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh

  Have a favorite UNIX tool to spice up shell script? Share it in the comments below.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-377926-1-1.html 上篇帖子: shell脚本报错“do_run.sh: line 14: syntax error: unexpected end of file” 下篇帖子: 用shell脚本 改变某目录下一类文件的后缀
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表