『壹』 expect腳本在linux下是如何使用的
如果你是expect腳本語言的新手,可以首先從我們的expect的「hello world」樣例(英文)開始。
1,使用「-c」選項,從命令行執行expect腳本
expect可以讓你使用「-c」選項,直接在命令行中執行它,如下所示:
$ expect -c 'expect "\n" {send "pressed enter\n"}
pressed enter
$
如果你執行了上面的腳本,它會等待輸入換行符(\n)。按「enter」鍵以後,它會列印出「pressed enter」這個消息,然後退出。
2,使用「-i」選項交互地執行expect腳本
使用「-i」選項,可以通過來自於標准輸入的讀命令來交互地執行expect腳本。如下所示:
$ expect -i arg1 arg2 arg3
expect1.1>set argv
arg1 arg2 arg3
expect1.2>
正常情況下,當你執行上面的expect命令的時候(沒有「-i」選項),它會把arg1當成腳本的文件名,所以「-i」選項可以讓腳本把多個參數當成一個連續的列表。
當你執行帶有「-c」選項的expect腳本的時候,這個選項是十分有用的。因為默認情況下,expect是交互地執行的。
3,當執行expect腳本的時候,輸出調試信息
當你用「-d」選項執行代碼的時候,你可以輸出診斷的信息。如下所示:
$ cat sample.exp
# !/usr/bin/expect -f
expect "\n";
send "pressed enter";
$ expect -d sample.exp
expect version 5.43.0
argv[0] = expect argv[1] = -d argv[2] = sample.exp
set argc 0
set argv0 "sample.exp"
set argv ""
executing commands from command file sample.exp
expect: does "" (spawn_id exp0) match glob pattern "\n"? no
expect: does "\n" (spawn_id exp0) match glob pattern "\n"? yes
expect: set expect_out(0,string) "\n"
expect: set expect_out(spawn_id) "exp0"
expect: set expect_out(buffer) "\n"
send: sending "pressed enter" to { exp0 pressed enter}
4,使用「-D」選項啟動expect調試器
「-D」選項用於啟動調試器,它只接受一個布爾值的參數。這個參數表示提示器必須馬上啟動,還是只是初始化調試器,以後再使用它。
$ expect -D 1 script
「-D」選項左邊的選項會在調試器啟動以前被處理。然後,在調試器啟動以後,剩下的命令才會被執行。
$ expect -c 'set timeout 10' -D 1 -c 'set a 1'
1: set a 1
dbg1.0>
5,逐行地執行expect腳本
通常,expect會在執行腳本之前,把整個腳本都讀入到內存中。「-b」選項可以讓expect一次只讀取腳本中的一行。當你沒有寫完整個腳本的時候,這是十分有用的,expect可以開始執行這個不完整的腳本,並且,它可以避免把腳本寫入到臨時文件中。
$ expect -b
6,讓expect不解釋命令行參數
你可以使用標識符讓expect不解釋命令行參數。
你可以像下面這樣的讀入命令行參數:
$ cat print_cmdline_args.exp
#!/usr/bin/expect
puts 'argv0 : [lindex $argv 0]';
puts 'argv1 : [lindex $argv 1]';
當執行上面的腳本的時候,會跳過命令行選項,它們會被當成參數(而不是expect選項),如下所示:
$ expect print_cmdline_args.exp -d -c
argv0 : -d
argv1 : -c
『貳』 請教大家Linux C語言編程
(2)很顯然這樣做是為了方便,例如某個函數需要傳入復制後的字元串,就可以用一行語句完成,而不必寫兩行了。
(1)
#include<stdio.h>
char *strcpy(char *strDest, const char *strSrc)
{
int i;
for (i=0;strSrc[i];++i)
strDest[i]=strSrc[i];
strDest[i]='\0';
return strDest;
}
int main(int argc,char *argv[])
{
char a[80];
puts(strcpy(a,"Hello,Linux!"));
return 0;
}
『叄』 linux中C語句不能操作物理地址,為什麼put
/*
* This function puts a page in memory at the wanted address.
* It returns the physical address of the page gotten, 0 if
* out of memory (either when trying to access page-table or
* page.)
*/
unsigned long put_page(unsigned long page,unsigned long address)
{
unsigned long tmp, *page_table;
/* NOTE !!! This uses the fact that _pg_dir=0 */
if (page < LOW_MEM || page >= HIGH_MEMORY)
printk("Trying to put page %p at %p\n",page,address);
if (mem_map[(page-LOW_MEM)>>12] != 1)
printk("mem_map disagrees with %p at %p\n",page,address);
page_table = (unsigned long *) ((address>>20) & 0xffc);
if ((*page_table)&1)
page_table = (unsigned long *) (0xfffff000 & *page_table);
else {
if (!(tmp=get_free_page()))
return 0;
*page_table = tmp|7;
page_table = (unsigned long *) tmp;
}
page_table[(address>>12) & 0x3ff] = page | 7;
/* no need for invalidate */
return page;
}
這里的address是所謂的線性地址,線性地址要映射到物理地址,當然要從線性地址自己身上找咯——就是高10是頁目錄,中間10位是頁表,後面12位數偏移。
『肆』 關於C語言中的puts函數
因為puts內部有緩沖區,當他存儲一個換行符或者到達buffsize-1的時候才停止讀取,並且將一個NUL位元組添加到緩沖區所存儲的字元串的尾端。
『伍』 一個Linux下C語言的問題,求大神解答!!
不改變代碼的話,估計叫你溢出堆棧,他給你的編譯命令行也把堆棧保護關掉了:no-stack-protector
GetInput執行完的返回地址,要被改成NeverExecutes的地址,然後返回就到了NeverExecutes
而且gets沒有檢查長度,所以你給他多少他就寫多少,寫到buffer外他也不檢查,你只要一直輸入把返回地址給正好覆蓋掉
不過有些字元不好輸入,估計再用其他程序往stdin里寫比較好
『陸』 linux下expect腳本問題
#!/usr/bin/expect-f
if{$argc!=1}{
puts"usage:$argv0IP"
exit1
}else{
setIP[lindex$argv0]
}
setpingcmd[format"ping-c100%s"$IP]
settimeout6000
#比如遠程用戶叫做test
setdestusertest
#比如遠程伺服器IP為如下
setdestip192.168.0.123
setdestpath"$destuser@$destip"
#比如用戶密碼叫做test
setdestpasswordtest
#ssh登錄
spawnssh$destpath
#######################
expect{
-re".*yes/no.*"{
exp_send"yes "
exp_continue
}
-re".*assword.*"{
exp_send"$destpassword "
}
}
#比如ssh登錄以後的提示符是test@Testserver>
expect{
-re".*test@Testserver.*"{
exp_send"$pingcmd "
}
}
expect{
#如果輸出timeout字元,則Control+C結束pingcmd
#這里用的是DestinationHostUnreachabl替換timeout。因為本人機器上沒有timeout.
-re".*DestinationHostUnreachabl.*"{
#輸入Control+c
exp_send"