在SSH进入另一个盒子时获取用户输入

时间:2011-08-12 23:48:33

标签: linux bash shell ssh

我有一个bash脚本,基本上应该像下面这样工作:

  • 从用户获取内部版本号并将其放入buildNum var

  • 通过使用buildNum作为参数调用本地脚本来准备本地计算机上的构建

  • 将准备好的zip文件sftp到远程server1

  • 执行此操作:

ssh -v $server1 <<EOF
rm -rvf path1-on-remote-server1/*
cd path2-on-remote-server1
unzip ../prepped-zip-file-$buildNum.zip
exit
EOF
  • 将准备好的zip文件sftp发送到远程服务器2

我遇到的问题是,在第4步的第四步,远程服务器不知道$ buildNum,它就失败了。

我尝试了以下两种解决方案,但都失败了:

  1. 使用双引号"unzip ../prepped-zip-file-$buildNum.zip"导致"unzip ../prepped-zip-file-11.6.zip: Command not found.

  2. 试图在SSH会话期间再次从用户那里获取内部版本号,因为甚至没有等待我的输入并查找名称末尾没有内部版本号的zip文件,因为var是空的,

  3. 我做了:

    ssh -v $server1 <<EOF
       rm -rvf path1-on-remote-server1/*
       cd path2-on-remote-server1
       echo "enter build num once more: "
       read bNum
       unzip ../prepped-zip-file-$bNum.zip
       exit
       EOF
    

    关于如何实现我的目标的任何建议。

    提前致谢

2 个答案:

答案 0 :(得分:3)

确定这不起作用吗?

ssh -v $server1 <<EOF
rm -rvf path1-on-remote-server1/*
cd path2-on-remote-server1
unzip ../prepped-zip-file-$buildNum.zip
exit
EOF

当我在我的机器上尝试使用cat而不是ssh -v $server1进行测试时,变量确实被替换为here-document,就好像整个文档都在命令行上一样。删除shell永远不需要知道首先有一个变量。

实际上,您可能希望在ssh命令行上提供远程命令,而不是重定向标准输入。如果它的某些部分意外地决定尝试从stdin读取,那么这将更加强大:

ssh -v $server1 "rm -rvf path1-on-remote-server1/*
  cd path2-on-remote-server1
  unzip ../prepped-zip-file-$buildNum.zip"

(注意多行双引号字符串可以使用bash)。

答案 1 :(得分:0)

#!/bin/sh
printf "Enter Build Number: "
read BUILD_NUM
cat << EOF | ssh $server1
hostname
echo "${BUILD_NUM}"
uptime
EOF

这适合我。