【问题标题】:getting user input while SSH'ed into another box在 SSH 进入另一个盒子时获取用户输入
【发布时间】:2011-08-13 08:10:31
【问题描述】:

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

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

  • 通过以 buildNum 为参数调用本地脚本,在本地机器上准备构建

  • 将准备好的 zip 文件 sftp 到远程服务器 1

  • 这样做:

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 到远程 server2

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

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

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

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

我做到了:

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

关于如何实现我所追求的任何建议。

提前致谢

【问题讨论】:

标签: linux bash shell ssh


【解决方案1】:

确定这不起作用吗?

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 命令行上提供远程命令,而不是重定向标准输入。如果它的某些部分意外决定尝试从标准输入读取,这将更加健壮:

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

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

【讨论】:

  • 我尝试了您建议的解决方案,效果很好。非常感谢。
  • +1 表示“使用命令行”。 (这在 SSH 协议中使用 exec 通道而不是 shell 通道,仅供参考。)
【解决方案2】:
#!/bin/sh
printf "Enter Build Number: "
read BUILD_NUM
cat << EOF | ssh $server1
hostname
echo "${BUILD_NUM}"
uptime
EOF

这对我有用。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多