sshfs_connect/main.go
2025-02-04 12:13:16 +01:00

86 lines
2.0 KiB
Go

package main
import (
"fmt"
"os"
"os/exec"
"github.com/moby/sys/mountinfo"
"github.com/kevinburke/ssh_config"
"flag"
)
var eFlag = flag.Bool("e", false, "open mountpoint in your editor")
func main() {
flag.Parse()
args := flag.Args()
if len(args) == 0 {
fmt.Println("No hostname specified.")
os.Exit(80)
} else {
hostname := ssh_config.Get(args[0], "HostName")
user := ssh_config.Get(args[0], "User")
port := ssh_config.Get(args[0], "Port")
ifile := ssh_config.Get(args[0], "IdentityFile")
if len(hostname) == 0 || len(user) == 0 || len(ifile) == 0 {
fmt.Println("Hostname not found in ~/.ssh_config")
os.Exit(3)
} else {
mount := verify_mount_dir(hostname)
fmt.Println("Hostname: ",hostname)
fmt.Println("User: ", user)
fmt.Println("Port: ", port)
fmt.Println("Ifile: ", ifile)
fmt.Println("Mount: ", mount)
fmt.Println("---")
chkmount, chkmount_err := mountinfo.Mounted(mount)
if chkmount_err != nil {
fmt.Println("mountinfo.Mounted() failed with %s\n", chkmount_err)
}
if chkmount == false {
mount_sshfs(hostname, user, ifile, port, mount)
} else {
fmt.Println("!!! Already mounted")
}
run_editor(mount)
}
}
}
func run_editor(mount string) {
if(*eFlag == true) {
cmd := exec.Command("subl", mount)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println("run_editor() failed with\n",err)
}
}
}
func verify_mount_dir(hostname string)(mount string) {
homedir, homedirerr := os.UserHomeDir()
if homedirerr != nil {
fmt.Println( homedirerr )
}
mount = homedir+"/Servers/"+hostname
os.MkdirAll(mount, os.ModePerm)
return
}
func mount_sshfs(hostname string, user string, ifile string, port string, mount string) {
cmd := exec.Command("sshfs", "-p", port, "-o", "IdentityFile="+ifile+",idmap=user,dir_cache=no", user+"@"+hostname+":/", mount)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println("mount_sshfs() failed with\n",err)
}
}