我真的可以使用一些帮助。我期待还是很新的。我需要在运行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到第二个主机)。
答案 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
没有愚蠢的混乱。