【问题标题】:Shell script with ssh command with an if statement带有 ssh 命令和 if 语句的 Shell 脚本
【发布时间】:2014-01-02 18:07:22
【问题描述】:

我想编写一个 shell 脚本来执行以下操作:

  1. 一次登录一些远程机器,比如 host1 和 host2
  2. 转到 /tmp 目录并检查是否存在名为 'dirname' 的特定目录。如果不存在,则创建一个目录 'dirname'
  3. 进入目录/tmp/dirname
  4. 从本地机器复制一个带有变量runNo的文件到这个目录

我尝试了类似的方法,但它不起作用.. 任何帮助将不胜感激。谢谢!

#! /bin/bash
dir1=dirname
runNo=0

for i in 1 2
do
  runNo=$(($runNo+1))
  echo "host$i runNo$runNo"

  ssh host$i "cd /tmp;
    if [ -d $dir1 ]; then
      cd $dir1;
    else
      mkdir $dir1;
      cd $dir1;
    fi;
    cp ~/local/file$runNo file"

  echo "done"
done

【问题讨论】:

  • 不要测试$dir1是否存在,只需使用mkdir -p "$dir1"。如果它已经存在,则什么都不会发生。
  • 也就是说,在不检查 cd 是否成功的情况下,永远不要 cd 进入目录。 if mkdir -p "/tmp/$dir1" && cd "/tmp/$dir1"; then … else [handle error]; fi
  • 另外,试着从小一点开始看看它是否 ssh 工作...ssh host$i "cd /tmp; touch imhere" 看看文件imhere 是否存在于远程机器中。

标签: bash shell unix if-statement ssh


【解决方案1】:

怎么样

ssh host$i "mkdir -p /tmp/$dir1"
scp ~/local/file$runNo host$i:/tmp/$dir1/file

mkdir -p 如果目录已存在,则抑制错误。

【讨论】:

  • 我认为cp ~/local/... 位也不是他想要的(除非他有一些他没有解释的花哨的 NFS 设置)。他可能需要在循环内有一个单独的scp 行。
  • @dg99,谢谢,我没有足够关注。
【解决方案2】:

也许像这样?

runNo=1
for h in host1 host2; do
    cat ~/local/file$runNo |
    ssh "$h" 'mkdir -p /tmp/dirname; cat >/tmp/dirname/file'
    runNo=$(($runNo+1))
done

如果我正确解释了您的描述,cd 是多余的。

如果需要 Bourne shell 兼容性,您可以将增量替换为

    runNo=$(expr $runNo + 1)

【讨论】:

    【解决方案3】:

    试试这个:

    ssh -t -t host$i <<eod1
    echo "your command goes here"
    add eod1 to terminate your ssh
    eod1
    

    注意两个 -t -t 是需要覆盖 sudo 终端错误

    这个编辑规则快把我逼疯了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2013-09-18
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多