使用sshfs和expect在Bash中自动挂载远程目录

时间:2018-04-21 14:37:32

标签: bash expect sshfs

我可以使用root用户挂载远程SFTP目录,但是当我尝试运行bash脚本以自动执行相同操作时,脚本运行时没有错误,但是从不创建挂载。

我正在使用:

#!/bin/bash

_SSHHOST="sub.domain.com"
_SSHUSER="10001"
_SSHPASS="somepass"
_DATADIR="/mnt/data"

# Create user if doesn't exist
id -u $_SSHUSER &>/dev/null || useradd $_SSHUSER 
# Create directory if doesn't exist
mkdir -p $_DATADIR/$_SSHUSER
# Change ownership of dir to new user
chown $_SSHUSER:root $_DATADIR/$_SSHUSER

/usr/bin/expect <<EOD

spawn sshfs $_SSHUSER@$_SSHHOST:/remote/dir $_DATADIR/$_SSHUSER
expect "Password: "
send "$_SSHPASS\r"
expect "#"

EOD

未创建任何安装且创建的目录中未列出任何文件。我很欣赏有些人会说要避免使用Bash并在Expect中直接创建它,但这只是执行大量bash函数的较大脚本的一小部分。我做错了什么?

感谢您的帮助。

更新 我通过将-o password_stdin传递给sshfs命令来修复此问题。谢谢大家的关注。

2 个答案:

答案 0 :(得分:2)

所以我认为你遇到的问题只适用于你正在使用它的程序的输出

在这种情况下,sshfs会提示:

$_SSHUSER@$_SSHHOST's password:

一旦你正常输入密码,它就会分到后台,而且不会有#期望获得。

我认为你看到的是sshfs工具分叉后终端下一行的#,所以你不能指望

作为expect脚本的替代方法,sshfs通过带有

的stdin接受密码
echo $_SSHPASS | sshfs -o password_stdin $_SSHUSER@$_SSHHOST:/remote/dir $_DATADIR/$_SSHUSER

答案 1 :(得分:0)

我通过将-o password_stdin传递给sshfs命令来修复此问题。谢谢大家的关注。