2011-03-22 127 views
2

我需要编写脚本来将远程服务器文件复制到服务器后端的服务器上。类似如下:如何在shell脚本中从远程服务器复制文件?

#!/usr/bin/expect -f 
    spawn /usr/local/bin/scpdata.sh 
    set timeout 3000 
    expect "[email protected]'s password:" 
    set timeout 3000 
    send "xxxx" 
    set timeout 3000 
    send "exit\r" 
    expect eof 

scpdata.sh文件

#!/bin/bash 
    scp [email protected]:/tmp/11-03-15_03:00:01.tar.gz /tmp 

但这不行,哪里是问题,怎么办呢?请帮助

+0

@ user670809:究竟是什么出了问题? scp命令? – Heisenbug 2011-03-22 08:46:18

回答

2

我建议你使用公共密钥认证,而不是(生成ssh-keygen客户端上的公钥/私钥对,增加公众(.ssh/id.pub默认)键.ssh/authorized_keys服务器—看到手册页)。比你可以:

  • 给该键的密码使用ssh-agent,或
  • 使用无密码的重要进步。

在后一种情况下,我建议你限制的关键在于一个特定的命令。我不知道如何设置scp命令,但是

ssh [email protected] '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上的任何内容的位置命令行),检查它是允许的文件之一,并将其​​记录下来。

+0

是的,它可以使用ssh-keygen,但有时不能改变服务器中的任何东西,这仍然是问题。 – user670809 2011-03-22 08:56:14

+0

@ user670809:你只需把钥匙在一个文件中,你登录为用户,这是可能的,当你有简单的ssh访问的主目录。任何不可能的更高级的配置可能会由知道(或至少会理解)为什么使用以及如何设置ssh公钥验证的合格系统管理员完成。 – 2011-03-22 12:27:06

+0

thans,1月你是对的, – user670809 2011-03-24 01:30:14

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