【发布时间】:2020-03-30 02:45:50
【问题描述】:
我需要通过 SSH 在远程服务器上运行一个函数。我正在使用期望自动登录到远程服务器。在远程机器上,我可以运行命令、本地脚本,但功能不起作用。我得到“bash:foo:找不到命令”。也许函数定义不会像发送命令一样发送到服务器。这是我的脚本:
#!/bin/bash
foo(){ ls -la; } # to run in remote machine
cmd="ls -la"
func="foo"
ip='1.2.3.4'
pass='abcd'
export ip pass cmd func
/usr/bin/expect <(cat <<-'EOF'
set timeout 60
# spawn ssh -t $::env(ip) "ls -la" # Working
# spawn ssh -t $::env(ip) $::env(cmd) # Working
# spawn ssh -t $::env(ip) $::env(func) # Not working; bash: foo: command not found
# spawn ssh -t $::env(ip) "$(typeset -f $::env(func)); $::env(func)" # Not working
expect {
"yes/no" {
send "yes\r"
exp_continue
}
"*assword*" { send "$::env(pass)\r" }
}
interact
EOF
)
echo -e "\nDone."
是否可以使用 ssh/expect 在远程机器上运行函数?
【问题讨论】:
-
export不能跨 ssh 工作。 -
@pynexj 我使用 export 使 bash 变量在 heredoc
expect中可用。ip和pass在ssh中都能很好地解释,但问题在于函数foo。 -
您没有导出函数的定义。使用
export -f虽然它不能跨 ssh 工作。