期望具有可变主机名的脚本

Expect script with variable hostname

我想在重启数十台 UBUNTU 服务器(12.04 和 14.04)后使用 EXPECT 脚本装载卷。

我无法弄清楚如何将主机名设置为变量(例如从 /etc/hostname 获取记录)-> 我不想为每个服务器创建一个脚本(设置特定的主机名)。我的想法是在我的环境中使用这个全局脚本。

以下脚本工作正常 - 但已设置修复主机名

#!/usr/bin/expect -f

set timeout 90

set sudo_pass "Password01
set mount_pass "Password02"
set hostname "test-staging"          <<<==== here I set static hostname

# turns off the output to STDOUT
log_user 0

# run mount-script
spawn sudo mount-script

# type sudo pass
expect "password for"
send "$sudo_pass\r"

# type Pass for mount-script
expect "Enter passphrase"
send "$mount_pass\r"

# call & paste hostname
expect "Please provide a hostname for this instance,"
send "$hostname\r"

# type letter Y - for test environment
expect "Is this a test instance?  Enter 'Y', otherwise press enter"
send "Y\r"

interact

我尝试 google 我发现主机名的命令像

send 'lsnrctl status listener_`hostname`\r'

send "cat /etc/rc.d/rc.local |grep hostname \r\n"

我尝试将它们设置为 SET HOSTNAME,并尝试通过命令发送调用它们。不幸的是,它也不起作用。

这是输出

    .......    
    dbg1.7>
    1: expect "Please provide a hostname for this instance
    dbg1.8>
    Please provide a hostname for this instance
    1: send 'lsnrctl status listener_`hostname`\r'

    dbg1.9>
    usage: send [args] string
        while executing
    "send 'lsnrctl status listener_`hostname`\r'"
        (file "test01-expect.sh" line 38)
    1: exit 1

我也对不同的解决方案持开放态度。 谢谢

要获取机器的主机名,你不能使用终端命令hostname吗?

Tcl 有一个命令 exec,它将执行命令并 return 结果。

set host_name [exec hostname]

或者,等价地,

set host_name [ exec cat /etc/hostname]

无需将其保存到变量中,甚至可以直接在发送命令中使用,

expect "Please provide a hostname for this instance,"
send "[exec hostname]\r"

参考:exec