如何在将文件 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] $
如果在 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] $