期待:在sftp之后启动scp

时间:2015-09-08 22:42:59

标签: bash sftp expect scp

我真的可以使用一些帮助。我期待还是很新的。我需要在运行sftp后直接启动scp命令。

我得到了这个脚本的第一部分,我的主要关注点是底部。我确实需要在此命令完成后启动命令。我宁愿能够产生另一个命令,比如使用睡眠命令来管理它并在10秒后运行它或者奇怪的东西。

非常感谢任何建议!

spawn sftp user@host
expect "password: "
send "123\r"
expect "$ "
sleep 2
send "cd mydir\r"
expect "$ "
sleep 2
send "get somefile\r"
expect "$ "
sleep 2
send "bye\r"
expect "$ "
sleep 2

spawn scp somefile user2@host2:/home/user2/
sleep 2

所以我发现如果我使用" exec"我可以实际启动子进程。而不是spawn ..换句话说:

exec scp somefile user2@host2:/home/user2/

唯一的问题?它提示我输入密码!这不应该发生,我已经在两个系统上安装了ssh-keys。 (换句话说,如果我从主机运行scp命令我运行这个期望脚本,它将运行而不提示我输入密码)。我试图scp的系统必须将这个新生成的进程识别为新主机,因为它没有拿起我的ssh-key。有什么想法吗?

顺便说一句,我道歉,我实际上并没有发布一个"工作"脚本,我无法在不降低服务器安全性的情况下做到这一点。我希望这不会影响任何人帮助我的能力。

我认为问题在于我没有终止最初产生的进程。我不明白期望足够做到这一点。如果我尝试"关闭"或者" eof",它只是杀死了我不想做的整个脚本(因为我仍然需要将文件scp到第二个主机)。

1 个答案:

答案 0 :(得分:2)

确保您的SSH私钥已加载到代理中,并且指向该代理的环境变量在您调用scp的会话中处于活动状态。

[[ $SSH_AUTH_SOCK ]] || {       # if no agent already running...
  eval "$(ssh-agent -s)"        # ...then start one...
  ssh-add /path/to/your/ssh/key # ...load your key...
  started_ssh_agent=1           # and flag that we started it ourselves
}

# ...put your script here...

[[ $started_ssh_agent ]] && {   # if we started the agent ourselves...
  eval "$(ssh-agent -s -k)"     # ...then clean up nicely when done.
}

顺便说一下,我强烈建议用以下内容替换问题中给出的代码:

lftp -u user,123 -e 'get /mydir/somefile -o localfile' sftp://host </dev/null
lftp scp://user2@host2 -e 'put localfile -o /home/user2/somefile' </dev/null

每个连接都在一行中处理,并且expect没有愚蠢的混乱。