Archive | Aralık, 2017

Expect command and how to automate shell scripts like magic

In the previous post, we talked about writing practical shell scripts and we saw how it is easy to write a shell script. Today we are going to talk about a tool that does magic to our shell scripts, that tool is the Expect command or Expect scripting language. Expect command or expect scripting language is a language that talks with your interactive programs or scripts that require user interaction. Expect scripting language works by expecting input, then the Expect script will send the response without any user interaction. You can say that this tool is your robot which will automate your scripts. If Expect command if not installed on your system, you can install it using the following command:

Continue Reading →

$ apt-get install expect

Or on Red Hat based systems like CentOS:

$ yum install expect

Expect Command

Before we talk about expect command, Let’s see some of the expect command which used for interaction:

spawn                  Starting a script or a program.

expect                  Waiting for program output.

send                      Sending a reply to your program.

interact                Allowing you in interact with your program.

  • The spawn command is used to start a script or a program like the shell, FTP, Telnet, SSH, SCP, and so on.
  • The send command is used to send a reply to a script or a program.
  • The Expect command waits for input.
  • The interact command allows you to define a predefined user interaction.

We are going to type a shell script that asks some questions and we will make an Expect script that will answer those questions.

First, the shell script will look like this:

#!/bin/bash

echo "Hello, who are you?"

read $REPLY

echo "Can I ask you some questions?"

read $REPLY

echo "What is your favorite topic?"

read $REPLY

Now we will write the Expect scripts that will answer this automatically:

#!/usr/bin/expect -f

set timeout -1

spawn ./questions

expect "Hello, who are you?\r"

send -- "Im Adam\r"

expect "Can I ask you some questions?\r"

send -- "Sure\r"

expect "What is your favorite topic?\r"

send -- "Technology\r"

expect eof

The first line defines the expect command path which is  #!/usr/bin/expect .

On the second line of code, we disable the timeout. Then start our script using spawn command.

We can use spawn to run any program we want or any other interactive script.

The remaining lines are the Expect script that interacts with our shell script.

The last line if the end of file which means the end of the interaction.

Now Showtime, let’s run our answer bot and make sure you make it executable.

$ chmod +x ./answerbot

$./answerbot

expect command

Cool!! All questions are answered as we expect.

If you get errors about the location of Expect command you can get the location using the which command:

$ which expect

We did not interact with our script at all, the Expect program do the job for us.

The above method can be applied to any interactive script or program.Although the above Expect script is very easy to write, maybe the Expect script little tricky for some people, well you have it.

Using autoexpect

To build an expect script automatically, you can the use autoexpect command.

autoexpect works like expect, but it builds the automation script for you. The script you want to automate is passed to autoexpect as a parameter and you answer the questions and your answers are saved in a file.

$ autoexpect ./questions

autoexpect command

A file is generated called script.exp contains the same code as we did above with some additions that we will leave it for now.

autoexpect script

If you run the auto generated file script.exp, you will see the same answers as expected:

autoexpect script execution

Awesome!! That super easy.

There are many commands that produce changeable output, like the case of FTP programs, the expect script may fail or stuck. To solve this problem, you can use wildcards for the changeable data to make your script more flexible.

Working with Variables

The set command is used to define variables in Expect scripts like this:

set MYVAR 5

To access the variable, precede it with $ like this $VAR1

To define command line arguments in Expect scripts, we use the following syntax:

set MYVAR [lindex $argv 0]

Here we define a variable MYVAR which equals the first passed argument.

You can get the first and the second arguments and store them in variables like this:

set my_name [lindex $argv 0]

set my_favorite [lindex $argv 1]

Let’s add variables to our script:

#!/usr/bin/expect -f

set my_name [lindex $argv 0]

set my_favorite [lindex $argv 1]

set timeout -1

spawn ./questions

expect "Hello, who are you?\r"

send -- "Im $my_name\r"

expect "Can I ask you some questions?\r"

send -- "Sure\r"

expect "What is your favorite topic?\r"

send -- "$my_favorite\r"

expect eof

Now try to run the Expect script with some parameters to see the output:

$ ./answerbot SomeName Programming

expect command variables

Awesome!! Now our automated Expect script is more dynamic.

Conditional Tests

You can write conditional tests using braces like this:

expect {

"something" { send -- "send this\r" }

"*another" { send -- "send another\r" }

}

We are going to change our script to return different conditions, and we will change our Expect script to handle those conditions.

We are going to emulate different expects with the following script:

#!/bin/bash

let number=$RANDOM

if [ $number -gt 25000 ]

then

echo "What is your favorite topic?"

else

echo "What is your favorite movie?"

fi

read $REPLY

A random number is generated ever time you run the script and based on that number, we put a condition to return different expects.

Let’s make out Expect script that will deal with that.

#!/usr/bin/expect -f

set timeout -1

spawn ./questions

expect {

"*topic?" { send -- "Programming\r" }

"*movie?" { send -- "Star wars\r" }

}

expect eof

expect command conditions

Very clear. If the script hits the topic output, the Expect script will send programming and if the script hits movie output the expect script will send star wars. Isn’t cool?

If else Conditions

You can use if/else clauses in expect scripts like this:

#!/usr/bin/expect -f

set NUM 1

if { $NUM < 5 } {

puts "\Smaller than 5\n"

} elseif { $NUM > 5 } {

puts "\Bigger than 5\n"

} else {

puts "\Equals 5\n"

}

expect command if command

Note: The opening brace must be on the same line.

While Loops

While loops in expect language must use braces to contain the expression like this:

#!/usr/bin/expect -f

set NUM 0

while { $NUM <= 5 } {

puts "\nNumber is $NUM"

set NUM [ expr $NUM + 1 ]

}

puts ""

expect command while loop

For Loops

To make a for loop in expect, three fields must be specified, like the following format:

#!/usr/bin/expect -f

for {set NUM 0} {$NUM <= 5} {incr NUM} {

puts "\nNUM = $NUM"

}

puts ""

expect command for loop

User-defined Functions

You can define a function using proc like this:

proc myfunc { TOTAL } {

set TOTAL [expr $TOTAL + 1]

return "$TOTAL"

}

And you can use them after that.

#!/usr/bin/expect -f

proc myfunc { TOTAL } {

set TOTAL [expr $TOTAL + 1]

return "$TOTAL"

}

set NUM 0

while {$NUM <= 5} {

puts "\nNumber $NUM"

set NUM [myfunc $NUM]

}

puts ""

expect command user-defined functions

Interact Command

Sometimes your Expect script contains some sensitive information that you don’t want to share with other users who use your Expect scripts, like passwords or any other data, so you want your script to take this password from you and continuing automation normally.

The interact command reverts the control back to the keyboard.

When this command is executed, Expect will start reading from the keyboard.

This shell script will ask about the password as shown:

#!/bin/bash

echo "Hello, who are you?"

read $REPLY

echo "What is you password?"

read $REPLY

echo "What is your favorite topic?"

read $REPLY

Now we will write the Expect script that will prompt for the password:

#!/usr/bin/expect -f

set timeout -1

spawn ./questions

expect "Hello, who are you?\r"

send -- "Hi Im Adam\r"

expect "*password?\r"

interact ++ return

send "\r"

expect "*topic?\r"

send -- "Technology\r"

expect eof

interact command

After you type your password type ++ and the control will return back from the keyboard to the script.

Expect language is ported to many languages like C#, Java, Perl, Python, Ruby and Shell with almost the same concepts and syntax due to its simplicity and importance.

Expect scripting language is used in quality assurance, network measurements such as echo response time, automate file transfers, updates, and many other uses.

I hope you now supercharged with some of the most important aspects of Expect command, autoexpect command and how to use it to automate your tasks in a smarter way.

Thank you.

likegeeks.com

0

Doç. Dr. Mustafa Akgül’ü kaybettik

LKD’nin kurucusu ve onursal üyesi Doç. Dr. Mustafa Akgül, bir süredir tedavi gördüğü hastanede bugün yaşamını yitirdi. Ailesinin acısını paylaşıyor; ailesine, üyesi olduğu dernek çalışma arkadaşlarına, üniversite camiasına ve öğrencilerine baş sağlığı diliyoruz. 1970’de ODTÜ İnşaat Mühendisliği mezunu olan Mustafa Akgül, 1974’te aynı üniversitede Matematik-işlemleri araştırmasını tamamladı. 1981 yılında Waterloo üniversitesi’nden (Kanada) kombinasyon ve optimizasyon üzerine doktora derecesini alan Akgül; Türkiye’de özgür yazılım topluluğunun dernekleşme öncesinde geçen 7 yılına öncülük ettiği gibi, Linux Kullanıcıları Derneği’nin kurulmasının ardından ilk 8 yılında yönetim kurulu başkanlığı görevini yürüttü.

Continue Reading →

Derneğin uzun yıllardır gelenek haline gelen ve onbinlerce kişiye ulaşan Özgür Yazılım ve Linux Günleri (Şenliği), Akademik Bilişim Öncesi Kurslar, Linux Yaz Kampı etkinliklerinin de öncüsü ve destekleyicisi olan Akgül; İnternet Teknolojileri Derneği’nin (INETD) başkanıydı.

0

LibreOffice 5.4.4 RC2 çıktı

İlk sürüm adayı 4 Aralık 2017‘de çıkarılan LibreOffice’in 5.4.4 serisinin ikinci sürüm adayı The Document Foundation (TDF) tarafından sürüm takvimine uygun biçimde çıkarılarak kullanıma sunuldu. The Document Foundation (TDF), henüz resmi duyuruyu yapmadı ama paketler test edilmek üzere yansılardaki yerini aldı. Bunun, yalnızca test etmek amacıyla kullanıma sunulan bir sürüm olduğunun unutulmaması ve yalnızca test etmek amacıyla kullanılması gerektiği hatırlatılıyor. LibreOffice 5.4.4 RC2’yi var olan LibreOffice kurulumuna paralel kurabilirsiniz. Farklı dağıtımlar için ayrıntılı kurulum yönergelerini incelemeniz önerilir. Sürüme ilişkin hataları Bugzilla üzerinden bildirebilirsiniz. LibreOffice 5.4.4 RC2 hakkında ayrıntılı bilgi edinmek için yayımlandıktan sonra sürüm notlarını inceleyebileceksiniz.

Continue Reading →

LibreOffice 5.4.4 RC2 edinmek için aşağıdaki linklerden yararlanabilirsiniz. Resmi duyuru yapılana kadar:

Resmi duyuru yapıldıktan sonra:

0

GIMP 2.9.8 duyuruldu

Dünyaca ünlü önemli bir resim işleme yazılımı olan GIMP‘in (GNU Image Manipulation Program), 2.9.8 sürümü, Alexandre Prokoudine tarafından duyuruldu. 2.10 yolundaki en yeni geliştirme sürümünün kullanıma sunulduğunu söyleyen Prokoudine; yazılımın Wayland Desteği de dahil olmak üzere çeşitli filtre/format geliştirmeleriyle geldiğini ifade etti. Güncellenmiş Blend aracını içeren yeni sürümde, varsayılan düğümler artık “düzenlenebilir” durumda. Katalanca, Hırvatça, Galiçyaca, Almanca, Yunanca, Macarca, İzlandaca, Endonezyaca, İtalyanca, Lehçe, Rusça, İspanyolca ve İsveççe olmak üzere 13 dilde güncelleme yapıldığını belirten Prokoudine; 2018’de GIMP 2.10’u yayınlamayı planladıklarını söyledi. Adobe Photoshop ve benzeri kapalı kaynak kodlu resim işleme yazılımlarına eşdeğer bir işlevler bütünü sunan GIMP, çeşitli gelişmiş özelliklerle geliyor. GNU/Linux dağıtımlarının vazgeçilmezi olan Gimp, Windows ve Mac OS X için çıkarılan sürümleriyle bu sistemlerde de yaygın olarak kullanılıyor. Renk işlemlerinin GEGL aracılığıyla yapıldığı uygulamada; güçlü araçlar, filtreler ve eklentiler kullanıcıyı bekliyor. Büyüklük ve opaklık yanında, fırçaya özgü dinamik özellikler; hız, basınç ve rastgele gibi çeşitli fırça parametreleri arasından uygun olanının seçimine olanak sağlanıyor. Hızlı boyama özelliğini zaten destekleyen mürekkep aracı, daha iyi resim çizimini mümkün kılıyor. GIMP’in çok yüksek çözünürlükleri destekleyen ve hareketli görüntülere efekt uygulaması yapan CinePaint adlı bir türevi de bulunuyor. GIMP 2.9.8 hakkında ayrıntılı bilgi edinmek için sürüm duyurusunu inceleyebilirsiniz.

Continue Reading →

GIMP 2.9.8 edinmek için aşağıdaki linklerden yararlanabilirsiniz.

0

Fedora 25 ömrünün sonuna geldi

Mohan Boddu; 22 Kasım 2016‘da duyurulan Fedora 25’in 12 Aralık 2017 tarihi itibariyle ömrünün sonuna geldiğini duyurdu. Bu tarihten sonra, Fedora 25 artık güvenlik güncelleştirmeleri de dahil olmak üzere destek için hiçbir güncellemeyi alamayacak. Ayrıca, Fedora 25 koleksiyonuna hiçbir yeni paket eklenmeyecek. Boddu; Fedora 25 kullanıcılarına 8 Ağustos 2017 tarihi itibariyle Fedora 26‘ya ya da Fedora 27‘ye yükseltme yapmalarının önerildiğini vurguladı.

Continue Reading →

Mohan Boddu’nun Fedora 25’in ömrünün sonuna geldiğine ilişkin duyurusunu inceleyebilirsiniz.

0

Fedora 27’nin server sürümü duyuruldu

27 final sürümü 14 Kasım 2017‘de duyurulan Fedora‘nın 27 server sürümü, Matthew Miller tarafından duyuruldu. Server versiyonunun “klasik” bir sürümünün çıkarıldığını söyleyen Miller; sürümün güncellenmiş paketi seti ile kullanıma sunulduğunu ifade etti. Rolekit ve Cockpit’in sunduğu kolaylığın sunucu dağıtımının kolay olmasını sağladığı söylenirken, Fedora 27 sunucu ile pek çok işin kısa bir sürede halledilebileceği belirtildi. Sistemin Cockpit’in güçlü ve çağdaş arayüzü ile kolayca yönetilebileceği belirtilirken, sistem veriminin görüntülenip izlenebileceği ve konteyner tabanlı hizmetlerin devreye alınıp yönetebileceği ifade ediliyor. Docker rolü ile Docker görüntülerinin çalıştırabileceği; Docker uzmanları ya da yeni başlayanların uygulamalarını kesintisiz bir şekilde geliştirebilecekleri söyleniyor. Fedora 27 server hakkında daha ayrıntılı bilgi edinmek için sürüm duyurusunu inceleyebilirsiniz.

Continue Reading →

Fedora 27 server edinmek için aşağıdaki linkten yararlanabilirsiniz.

0

ZFS’in (Zettabyte File System) 0.7.4 sürümü duyuruldu

Sun Microsystems firması tarafından geliştirilmesine 2000 yılında başlanan bir dosya sistemi ve mantıksal birim yöneticisi olan ZFS (Zettabyte File System)‘in 0.7.4 sürümü, Tony Hutter tarafından duyuruldu. Yeni sürümün 2.6.32 ile 4.14 Linux çekirdeği ile uyumlu olduğunu söyleyen Hutter; zfs-test paketinde otomatik bağımlılıkların devre dışı bırakıldığını ifade etti. Sürümde çeşitli hatalar giderilmiş bulunuyor. Veri bütünlüğünün bütünüyle korunması gözönünde tutularak geliştirilen ve bu amaçla volüm yönetimi, snapshot, copy-on-write, sürekli data bütünlüğü kontrolü, Raid-Z gibi pek çok aracı içeren ZFS’i, bu özellikleri, diğer dosya sistemlerinden ayırmaktadır. Oracle Solaris, FreeBSD, NetBSD, FreeNAS, MacOS X ve Linux kernelini kullanan sistemlerde kullanılabilen ZFS; ZFS’nin babası olarak bilinen ve Sun Microsystems bünyesinde bulunan Jeff Bonwick tarafından “The Last Word in File Systems” olarak tanımlanıyor. 2005 yılında da Solaris 10′a implement edilen, 2007 yılında ise FreeBSD’ye, Illumos grubu tarafından port edilen ZFS’in FreeBSD’ ye implementasyonu hala devam etmektedir. ZFS 0.7.4 hakkında ayrıntılı bilgi edinmek için sürüm duyurusunu sayfasını inceleyebilirsiniz.

Continue Reading →

zfs-file-system

ZFS’in, CDDL(Common Development and Distribution License) olarak bilinen Sun Microsystems’in kendi lisansı ile dağıtılmasından dolayı Linux’ta kullanabilmek için bazı gereklilikler söz konusuydu. CDDL lisansı, GPL(General Public License) ile bazı yönlerden dolayı uyumsuz olduğu için ancak FUSE ile kullanılabilirdi. ZFS’i , Linux’a eklemek için, kernelde değişiklikler yapmak gerektiğinden bu da GPL lisansının suistimali anlamına gelmekteydi. Şu andaki durum ise şöyle tarif edilebilir: Linux’ta ZFS kurulumu artık bir paket kurulumu kadar kolaydır. ZFS’in (Zettabyte File System) 0.7.4 edinmek için aşağıdaki linklerden yararlanabilirsiniz.

0