Bash在远程服务器上运行复杂命令

时间:2015-04-10 15:07:37

标签: bash ssh


我正尝试使用ssh远程运行此命令:

remote_command="fname=$(echo $(basename $(ls /opt/jboss/standalone/deployments/*.ear))); mv /opt/jboss/standalone/deployments/${fname}.undeployed /opt/jboss/standalone/deployments/${fname}.dodeploy"

此命令在远程服务器上重新部署ear文件(如果存在扩展名为.undeploy的ear文件)。只有一只耳朵。

remote_command变量传递给负责运行var remote_command的函数:

function run_remote_command() { 
  local command=$1
  local output=$(sshpass -pPassw ssh user@host_ip '$command' 2>&1)
}

对该功能的调用是

run_remote_command $remote_command

当我运行主脚本时,执行远程命令: 为var fname分配ear文件名的值。 但是当用mv。

执行时,$ fname为空

有人可以告诉我我错过了什么吗?

致以最诚挚的问候,

阿兰

1 个答案:

答案 0 :(得分:4)

由于您没有正确引用该命令,您的本地 shell正在展开$fname

function run_remote_command() { 
  local command=$1
  # must double quote the command here
  sshpass -pPassw ssh user@host_ip "$command"
}

# must use single quotes here. newlines added for clarity
remote_command='
  root=/opt/jboss/standalone/deployments
  ear_files=($root/*.ear)
  if [[ "${ear_files[0]}" ]]; then 
    fname=$(basename "${ear_files[0]}") 
    mv "$root/${fname}.undeployed" "$root/${fname}.dodeploy"
  fi
'

# must double quote the command here
run_remote_command "$remote_command"

我假设你的远程端的shell是bash。