如何在shell脚本中从远程服务器复制文件?

时间:2011-03-22 08:24:20

标签: shell ssh scp

我需要在服务器后端自动将用于复制远程服务器文件的脚本写到此处。如下所示:

#!/usr/bin/expect -f   
  spawn /usr/local/bin/scpdata.sh
  set timeout 3000
  expect "root@172.100.100.143's password:"
  set timeout 3000
  send "xxxx"
  set timeout 3000
  send "exit\r"
  expect eof

scpdata.sh文件

#!/bin/bash
  scp test@172.100.100.143:/tmp/11-03-15_03:00:01.tar.gz /tmp

但这不起作用,问题出在哪里以及如何做到这一点?请帮忙

2 个答案:

答案 0 :(得分:2)

我建议您使用公钥身份验证(在客户端上使用ssh-keygen生成公钥/私钥对,并将公共(默认情况下为.ssh/id.pub)密钥添加到.ssh/authorized_keys上服务器 - 参见手册页)。比你可以:

  • 使用ssh-agent
  • 提前为密钥提供密码
  • 使用没有密码的密钥。

在后一种情况下,我建议您将键限制为特定命令。我不知道如何为scp设置命令,但是

ssh test@172.100.100.143 'cat /tmp/11-03-15_03:00:01.tar.gz' > /tmp/11-03-15_03:00:01.tar.gz

是等价的。您只需在command="中的密钥前写下" 命令 .ssh/authorized_keys即可。当使用此密钥授权时,ssh服务器将始终运行指定的命令,无论ssh命令行上给出了什么。这可以限制攻击者在访问无密码密钥时可能造成的损害。

如果你需要改变文件的名称,你需要在服务器端编写一个脚本,它将提取$SSH_ORIGINAL_COMMAND的名称(这是服务器端脚本得到的东西)在ssh命令行上给出),检查它是否是允许的文件之一并捕捉它。

答案 1 :(得分:0)

  1. 发送密码时,您永远不会“点击输入”:send "xxxx\r"
  2. set timeout 3000实际上没有暂停 - 它将超时值设置为3000秒(50分钟)。如果您需要暂停,sleep 3
    • 如果你的期望模式是正确的,你几乎不需要明确地睡觉。使用exp_internal 1调试您的模式。
  3. 设置ssh密钥,根本不需要expect脚本。