En muchas distribuciones encontrar un enlace con la forma ssh://no viene configurado para ser abierto. A esto se le conoce como handler , y es necesario realizar algunas modificaciones.

Por un lado hay que registrar la aplicación.

xdg-mime default ~/.local/share/applications/ssh.desktop x-scheme-handler/ssh

Cuidado, en ocasiones la anterior no completa nuestra configuración. Una vez tengamos nuestro ssh.desktop en el directorio especificado anteriormente, puede ser que necesitemos ejecutar un xdg-settings set default-url-scheme-handler ssh ssh.desktop

Y necesitamos tener el ficherossh.desktop en la ruta ~/.local/share/applications/. Su contenido debe tener las siguientes líneas.

[Desktop Entry]
Name=SSH Handler
Terminal=false
NoDisplay=true
Type=Application
Exec=/usr/local/bin/ssh-handler.sh %u
Icon=utilities-terminal
StartupNotify=false
MimeType=x-scheme-handler/ssh;

Y como un comando ssh puede escribirse de varias formas, necesitamos contemplar la mayoría de ellas. Para ello tenemos el script que se indica en la línea Exec del fichero anterior.

#!/usr/bin/env bash

parseURL(){
    [ "$1" == "-i" ] && flg_cur=1 && shift 1
    local s=${1##ssh://}
    local a=${s%%@*}
    [ "$a" == "$s" ] && a=''
    local h=${s##*@}

    local user=${a%%:*}
    local pass=${a##*:}
    [ "$pass" == "$a" ] && pass=''
    local host=${h%%:*}
    local port=${h##*:}
    port=${port%%/}
    [ "$port" == "$h" ] && port=''

    decodeURIComponent(){
      echo "$1" | sed -e 's/%\([0-9A-Fa-f][0-9A-Fa-f]\)/\\\x\1/g' | xargs -0 printf "%b";
    }

    pass=`decodeURIComponent "$pass"`

    local cmd="$host"
    [ -n "$user" ] && cmd="$user@$cmd"
    [ -n "$port" ] && cmd="$cmd -p $port"
    cmd="ssh $cmd"
    [ -n "$pass" ] && cmd="sshpass -p '$pass' $cmd"

    echo "url: $1"
    echo "cmd: $cmd"
    echo
    [ -n "$flg_cur" ] && { eval "$cmd"; return; }
    
    kitty $cmd
}

parseURL "$@"

Este script debe estar ubicado donde se indique en el fichero .desktop y ha de ser ejecutable.

A tener en cuenta: Es posible que gvfsd tenga asociado ssh con sftp porque utilizan el mismo puerto. En este caso debemos cambiar esta configuración, porque si no el enlace se abrirá con el navegador de archivos que tengamos instalado e intentará montar ese recurso remoto.

Esta configuración podemos cambiarla en el fichero /usr/share/gvfs/mounts/sftp.mount. Y necesitamos comentar la línea SchemeAliases=ssh.

sed -ire 's/^SchemeAliases=ssh/#\0/' /usr/share/gvfs/mounts/sftp.mount

Y por suspuesto reiniciar el servicio gvfsd para que este cambio tenga efecto sin reiniciar.

kill -HUP $(ps faxu | grep gvfsd$ | awk '{print $2}')