在命令行使用 GVFS 挂载 FTP

在命令行使用 GVFS 挂载 FTP

我使用的是 Debian Jessie,没有桌面环境。我尝试使用 gvfs-mount 通过命令行挂载 FTP。

我在网上收集了一些信息,我了解到gvfs与dbus进行通信。

所以我的第一步是安装 dbus 和 gvfs 所需的软件包:

apt-get install dbus-x11 gvfs-bin gvfs-fuse

然后我重新启动,因为 dbus 安装了它自己的服务。

之后,我以 www-data 身份登录

sudo -Hu www-data -s /bin/bash

-s /bin/bash是因为该用户没有bash)

从这里,我必须dbus-daemon为我的用户启动并导出结果,DBUS_SESSION_BUS_ADDRESS以便 gvfs 与该守护进程进行通信。所以我这样做:

dbus-launch --sh-syntax > "$HOME/.dbus_settings"

.dbus_settings包含类似以下内容:

cat .dbus_settings 
DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-XwbyV2BmA5,guid=6c111d728c263543b61e6293570e1f22';
export DBUS_SESSION_BUS_ADDRESS;
DBUS_SESSION_BUS_PID=952;

我的环境变量DBUS_SESSION_BUS_ADDRESS此时尚未设置,所以我运行:

export DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-XwbyV2BmA5,guid=6c111d728c263543b61e6293570e1f22'

为了处理未来的 gvfs 安装,我.gvfs在我的用户中创建了一个文件夹$HOME(对于 www-data 来说是/var/www

现在,我想(但我不确定)我已经准备好使用 gvfs。所以我启动gvfsd熔断器像这样:

/usr/lib/gvfs/gvfsd-fuse $HOME/.gvfs -o big_writes

这似乎有效。文件夹 $HOME/.gvfs 似乎已安装(但其中还没有任何内容)。

最后一个命令是有效的 FTP 挂载:

gvfs-mount ftp://myftpuser@myftpserver < file_containing_ftp_password

但是,我总是收到此错误:

Error mounting location: Location is not mountable

这些步骤适用于我的 Linux Mint 17.3 amd64 桌面。但我无法让它在 Debian Jessie 服务器上运行(没有桌面和 x11)。

任何帮助表示赞赏。

答案1

我发现了问题。缺少一个包gvfs-backends,有些命令没用。

继续,步骤如下:

  1. 安装必要的包:

    apt-get 安装 dbus-x11 gvfs-bin gvfs-fuse gvfs-backends

  2. 如果 .gvfs 文件夹不存在,则创建它

    mkdir $HOME/.gvfs

  3. 启动 dbus 会话并存储DBUS_SESSION_BUS_ADDRESS以便能够重复使用它

    dbus-launch --sh-syntax > "$HOME/.dbus_settings"

  4. 导出DBUS_SESSION_BUS_ADDRESS使用source例如

    源“$HOME/.dbus_settings”

  5. 只需使用 gvfs-mount 挂载即可

    gvfs 安装ftp://myftpuser@myftpserver

Shell 将提示您输入密码。您还可以创建一个包含密码的文件并将其提供给 gvfs-mount,以便命令为:

gvfs-mount ftp://myftpuser@myftpserver < file_containing_my_ftp_password
  1. 在此位置访问您安装的 FTP:

    cd $HOME/.gvfs/ftp:主机\=myftpserver\,用户\=myftpuser/

完毕 !

答案2

最好用一下dbus-run-session some-script.sh,然后可以调用gio mount里面的或者其他gio工具some-script.sh

dbus-run-session 将在脚本执行后杀死 dbus-daemon,或者如果您使用 .dbus-run-session,则需要手动杀死 dbus-daemon dbus-launch

使用 dbus-run-session 会有点麻烦,因为你需要编写另一个脚本并用命令 dbus-run-session 调用它。

你可以这样做:

#!/bin/sh

sed '1,/^exit$/d' $0 | dbus-run-session sh
exit

ftp_url=ftp://[email protected]/
ftp_password=password
echo $ftp_password | gio mount $ftp_url

ftp_gio_name=$(
    gio info $ftp_url | awk '$1 == "id::filesystem:" { print $2 }'
)
ftp_gio_path=$HOME/.gvfs/"$ftp_gio_name"
archive_path=$HOME/data

cp --archive --verbose --update \
   "$ftp_gio_path"/ \
   $archive_path

gio mount -u $ftp_url

或使用尾部:

#!/bin/sh
tail +4 $0 | dbus-run-session sh
exit

# script here

或使用heredoc:

dbus-run-session sh <<DBUS_SESSION

# script here
# but you need to escape $ and \

foo=bar
echo \$foo
touch white\\ space

DBUS_SESSION

相关内容