web-dev-qa-db-fra.com

Comment exécuter des fichiers de script (.sh) dans un nouveau terminal après la connexion au serveur Ubuntu 16.04 via ssh?

J'ai essayé de nombreuses manières telles que

terminator -x abc.sh La commande ci-dessus me donne cette erreur:

You need to run terminator in an X environment. Make sure $DISPLAY is properly set

J'ai aussi essayé

gnome-terminal -x ./abc.sh

La commande ci-dessus me donne l'erreur ci-dessous

Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Failed to parse arguments: Cannot open display:
3
Avery

Assumer Ubuntu à Ubuntu

Si vous utilisez le bureau Windows 10 et souhaitez vous connecter à votre serveur Ubuntu

Une solution simple consiste à installer et utiliser PuTTY sous Windows en suivant le lien suivant:

www.PuTTY.org/

PuTTY est un client SSH et telnet, développé à l'origine par Simon Tatham pour la plate-forme Windows. PuTTY est un logiciel open source disponible avec code source, développé et soutenu par un groupe de volontaires.

Vous pouvez télécharger PuTTY ici .

Vous pouvez démarrer une ou plusieurs fenêtres PuTTY et exécuter différentes tâches via ssh.


Comme décrit dans un commentaire de @SergiyKolodyazhnyy, vous pouvez utiliser xrdp pour ouvrir une session de bureau à distance de Windows à Ubuntu.

Comme décrit dans un commentaire de @PerlDuck, vous pouvez installer et utiliser un serveur X sous Windows pour pouvoir exécuter des programmes d'application graphiques via ssh, mais selon votre question initiale, il pourrait être excessif.

3
sudodus

Voici la chose: terminator et gnome-terminal sont des applications graphiques. Si votre script ne nécessite pas d'interface graphique et est un script Shell simple, vous pouvez l'exécuter correctement dans votre session SSH sans avoir besoin d'un émulateur de terminal. Bien entendu, votre script doit vivre sur le système de fichiers sur lequel vous essayez de l'exécuter.

Si pour quelque raison que ce soit, vous avez absolument besoin de terminator ou gnome-terminal, vous pouvez toujours utiliser xrdp pour démarrer une session de bureau à distance. C'est bien sûr si le système Ubuntu auquel vous essayez d'accéder a un serveur X; Les ordinateurs serveurs, par exemple, souvent n’ont pas d’interface graphique, car c’est un risque pour la sécurité.

2

Il est possible d'exécuter une application nécessitant une interface graphique de la session SSH dans la session de bureau si vous en avez vraiment besoin. J'utilise l'approche suivante pour lancer des machines virtuelles VMWare lorsque j'en ai besoin, mais je ne suis pas à l'avant de l'ordinateur.

Je tiens à souligner que vous avez indiqué que vous vous connectez à Ubuntu Server, l’environnement de bureau n’est pas installé par défaut. Et dans ce cas, il vaut la peine d'utiliser tmux ou screen, ou de pousser le script en arrière-plan ou d'utiliser une seconde session SSH. Si un environnement de bureau est installé sur le serveur , les étapes suivantes peuvent être appliquées.

Les scripts suivants fonctionnent avec Lightdm et Unity, qui sont les paramètres par défaut pour Ubuntu 16.04.


1. La première exigence est que votre utilisateur soit connecté à la session Desktop. Le script suivant ( source et explications ) est le suivant:

#!/bin/bash

# NAME: lightdm-auto-login

main() {
    # If the file '/etc/lightdm/lightdm.conf' exists create a backup copy
    [[ -f /etc/lightdm/lightdm.conf ]] && mv /etc/lightdm/lightdm.conf{,.bak}

    # Create autologin configuration for the current $USER = $1
    echo -e "[Seat:*]\nautologin-user=$1" > /etc/lightdm/lightdm.conf

    # Restart 'lightdm' while autologin option is enabled
    systemctl restart lightdm.service

    # Wait for a moment to complete the login process and remove the conf file
    sleep 30 && rm /etc/lightdm/lightdm.conf

    # Restore the backup if exists
    [[ -f /etc/lightdm/lightdm.conf.bak ]] && mv /etc/lightdm/lightdm.conf{.bak,}
}

# Execute the 'main()' function with root privileges in the background 'Sudo -b'
# Pass the curent $USER as arg (https://unix.stackexchange.com/a/269080/201297)
Sudo -b bash -c "$(declare -f main); main $USER"
  • Le script doit être exécuté en tant qu'utilisateur normal (appartenant au groupe sudoers).

  • Je préférerais placer le script dans /usr/local/bin pour qu'il soit accessible en tant que système de commande Shell. N'oubliez pas de le rendre exécutable.


2. Deuxièmement, quelques variables d'environnement (telles que $DISPLAY, etc.) doivent être exportées de la session Desktop vers la session SSH. Le script suivant le fera et lancera également les commandes passées en tant que paramètres de position ( source et explications ):

#!/bin/bash -e

# NAME: gui-launcher

# Check whether the user is logged-in
while [ -z "$(pgrep gnome-session -n -U $UID)" ]; do sleep 3; done

# Export the current desktop session environment variables
export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ")

# Execute the input command
Nohup "$@" >/dev/null 2>&1 &

exit 0
  • Le script fonctionnera jusqu'à ce que l'utilisateur soit connecté, y compris un écran verrouillé.

  • Je préférerais placer le script dans /usr/local/bin pour qu'il soit accessible en tant que système de commande Shell. N'oubliez pas de le rendre exécutable.


3. Utilisation:

  • Établir une session SSH;
  • Exécutez lightdm-auto-login;
  • Exécutez gui-launcher <commands or script>, pour exemple :

    gui-launcher gnome-terminal -x bash -c "<my command or script>; exec bash"
    

    Notez que la dernière sous-commande exec bash gardera ouvert le gnome-terminal lancé, une fois la commande précédente terminée.


4. Démonstration:

enter image description here


5. Références et autres exemples:

1
pa4080