shell脚本,登录ftp执行完操作之后,后面的命令不执行

ftp -v -n <<EOF
open 192.168.0.1
user Administrator Password
prompt
mput *.deb
EOF

在这之后的命令就不执行了,运行shell提示
211 Goodbye.

img

img

在使用ftp命令进行FTP操作时,需要注意以下几点:

  1. ftp命令在执行完输入的FTP命令后会退出,因此在EOF标记之后的命令不会被执行。
  2. 如果你希望在FTP操作之后继续执行其他命令,可以将FTP命令放在后台执行,或者使用expect等工具来自动化交互。

下面是两种实现方式的示例:

方式一:后台执行

ftp -v -n <<EOF &
open 192.168.0.1
user Administrator Password
prompt
mput *.deb
EOF

# 继续执行其他命令
echo "FTP操作已完成"

在上述示例中,ftp命令被放在后台执行,因此脚本会继续执行其他命令。

方式二:使用expect工具

如果你希望在FTP操作期间自动化处理交互,可以使用expect工具。expect可以模拟人工输入并与FTP服务器进行交互。以下是一个示例:

#!/usr/bin/expect -f
spawn ftp -v -n 192.168.0.1
expect "Name"
send "Administrator\r"
expect "Password"
send "Password\r"
expect "ftp>"
send "prompt\r"
expect "ftp>"
send "mput *.deb\r"
expect "ftp>"
send "bye\r"

# 继续执行其他命令
puts "FTP操作已完成"

请根据你的需求选择适合的方式来处理FTP操作后的命令执行。

TechWhizKid参考GPT回答:

  • 可能是由于FTP命令失败或者异常的退出导致脚本终止。

  • 这是因为bash脚本在一条命令执行失败后,默认会继续执行后面的命令,但是如果你设置了“set -e”或者“set -o errexit”,则会在命令失败后立即退出。

在你的情况下,试下面几种解决办法:

  1. 将FTP命令放在一个子shell中,这样即使FTP命令失败,也不会影响到主脚本的执行。这可以通过在FTP命令前后加上括号实现:

    (
    ftp -v -n <<EOF
    open 192.168.0.1
    user Administrator Password
    prompt
    mput *.deb
    EOF
    ) || echo "FTP command failed"
    

    这里,如果FTP命令失败,会打印出"FTP command failed",但是脚本会继续执行。

  2. 用"set +e"命令来暂时关闭“在命令失败时退出”的设置,然后在FTP命令之后再用"set -e"命令恢复这个设置:

    set +e
    ftp -v -n <<EOF
    open 192.168.0.1
    user Administrator Password
    prompt
    mput *.deb
    EOF
    set -e
    

    这样,即使FTP命令失败,后面的命令也会继续执行。

采用chatgpt:
在Shell脚本中,当使用FTP命令登录并执行完操作后,后续命令无法执行的原因是FTP命令会启动一个新的子shell来处理FTP会话,然后在FTP会话结束后返回到主shell。

为了解决这个问题,可以将FTP命令放在后台执行,这样主shell可以继续执行后续命令。可以使用&符号将FTP命令放到后台执行,然后使用wait命令等待后台任务完成。下面是修改后的脚本示例:

#!/bin/bash

ftp -v -n <<EOF &
open 192.168.0.1
user Administrator Password
prompt
mput *.deb
bye
EOF

wait

# 在FTP命令执行完成后,继续执行后续命令
echo "FTP操作已完成,继续执行后续命令..."
# 在这里写入你的后续命令

在上面的示例中,&符号将FTP命令放到后台执行,然后使用wait命令等待后台任务完成。一旦FTP命令执行完成,主shell会继续执行后续命令。

请注意,bye命令用于在FTP会话结束时关闭连接。你可以在EOF块的最后添加其他FTP命令或更改FTP命令来满足你的需求。

希望这可以帮助到你!

FTP命令会占用标准输入STDIN,所以在FTP命令结束后,需要使用EOF结束标记来告诉一下shell已经输入完毕,否则之后的命令会被当作FTP的命令的输入,就导致无法执行了。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢