如何在将文件 scp 到远程服务器时添加超时,如果没有权限通过 expect 脚本执行 sudo

how to add timout while scp the file to remote server and if no privilege to sudo via expect script

如果在 scp 文件时没有对 /tmp 文件夹的权限,如果在下面执行 sudo 命令时没有 sudo 权限,我想添加超时 script.Could 请建议

spawn scp -o StrictHostKeyChecking=no \
    /tmp/rem_script.sh $env(user_name)@$env(first_db_node_ip):/tmp
expect "password:"
send -- "$env(rem_password)\r"
expect eof

spawn ssh -o StrictHostKeyChecking=no $env(user_name)@$env(first_db_node_ip)
expect "password:"
send -- "$env(rem_password)\r"

expect -ex $
send "PS1=UGLY-PROMPT'# '\r"
expect "UGLY-PROMPT# "

send "sudo chmod 777 /tmp/rem_script.sh\r"
expect {
  "password:" {
    send -- "$env(rem_password)\r"
    exp_continue
  }
  "UGLY-PROMPT# " {}
}

send "sudo sh /tmp/rem_script.sh $env(asrm_name) $env(com_str)\r"
expect {
  "password:" {
    send -- "$env(rem_password)\r"
    exp_continue
  }
  -timeout 60 "UGLY-PROMPT# " {}
}

send "exit\r"
expect eof

如果你想在超时时做一些事情而不是停止等待列出的模式,你需要一个 "timeout" 模式。类似于以下内容:

send "sudo sh /tmp/rem_script.sh $env(asrm_name) $env(com_str)\r"
expect { 
    -timeout 60
    "password:" {
        send -- "$env(rem_password)\r"
        exp_continue
    }
    timeout { send_user "timed out!" } 
    "UGLY-PROMPT# " {}
}

或者在等待其他模式超时时你想做的任何事情。

如果您没有 sudo 或您希望拥有的其他权限,您可能还想添加专门查找错误消息的模式。

中的以下代码 有效:

expect -timeout 60 {
    "password:" {
        send -- "$env(rem_password)\r"
        exp_continue
    }
    timeout { send_user "timed out!" } 
    "UGLY-PROMPT# " {}
}

相反,我们必须将 -timeout N 放在 expect {} 块中。请参阅以下示例:

[STEP 101] $ cat foo.exp
proc expect_prompt {} {
    global spawn_id
    expect -re {bash-[.0-9]+(#|$)}
}

spawn bash --norc --noprofile

expect -timeout 2 {
    not-found {}
    timeout {
        send_user ">>> you should never see this.\n"
    }
}

expect {
    -timeout 2 not-found {}
    timeout {
        send_user ">>> instead, you would see this.\n"
    }
}

expect_prompt
send "exit\r"
expect eof
[STEP 102] $ expect foo.exp
spawn bash --norc --noprofile
bash-4.4$ >>> instead, you would see this.
exit
exit
[STEP 103] $