Création d'un client léger basé sur des PC à carte unique bon marché

Parfois, vous devez créer un client léger rusé - avec une autorisation inhabituelle et de faibles coûts.

Linux est la façon la plus simple de l'utiliser.

Pour les PC à carte unique basés sur ARM, la distribution Armbian , qui est basée sur la branche Debian, est répandue.

Pour les expériences, j'avais une carte OrangePi One
image
et une carte MicroSD sur 2G - j'ai dĂ©cidĂ© d'en faire un client RDP lĂ©ger avec une fenĂȘtre de verrouillage et sans logiciel inutile.

La distribution Armbian pour ce forum est ici .

Téléchargez le dernier avec une note:

Scénarios d'utilisation du serveur ou du bureau léger.

Il n'aura pas de bureau qui n'est pas nécessaire dans le client léger.

Nous écrivons l'image sur MicroSD (j'ai utilisé sourceforge.net/projects/win32diskimager ).

AprÚs l'enregistrement: insérez MicroSD, connectez toutes les interfaces (LAN, écran, clavier, souris), mettez sous tension, attendez qu'il se charge.

Lorsque le systÚme démarre, vous serez invité à saisir votre identifiant et votre mot de passe. Vous pouvez également accéder à SSH en regardant l'adresse DHCP fournie (j'ai profité de cette occasion pour ne pas piloter les paramÚtres à partir du clavier et j'ai démarré PuTTY).

Connexion: root
Mot de passe: 1234

Une fois connecté, le systÚme vous demandera de changer le mot de passe: entrez le 1234 actuel et deux fois un nouveau mot de passe.

Il est également proposé de créer un utilisateur - appelons-le utilisateur .

AprÚs cela, nous procédons à la configuration du systÚme pour la tùche.

Installez les packages manquants:

apt update apt install xorg lightdm xcursor-themes numix-gtk-theme numix-icon-theme apt install python-gtk2 freerdp 

Le démarrage de la connexion graphique pour systemd s'activera comme ceci:

 systemctl set-default graphical.target 

Créez les fichiers:
(les rendre est plus facile avec l'Ă©diteur vi - aprĂšs avoir commencĂ© avec le paramĂštre, vous devez appuyer sur i pour coller - puis coller simplement le texte dans la fenĂȘtre de la console, et lorsque vous avez terminĂ©, appuyez sur Echap et tapez: w pour Ă©crire et: q pour quitter)

Pour obtenir vos paramĂštres via un serveur DHCP

 vi /etc/dhcp/dhclient-exit-hooks.d/paramscript 

 setup_add() { echo $new_host_name > /etc/hostname hostname $new_host_name if [ -z "$new_nds_servers" ] ; then echo $new_routers > /tmp/rdp_server echo "testuser" > /tmp/rdp_user echo "1234test#" > /tmp/rdp_passwd else echo $new_nds_servers > /tmp/rdp_server echo $new_nds_tree_name > /tmp/rdp_user echo $new_nds_context > /tmp/rdp_passwd fi } case $reason in BOUND|RENEW|REBIND|REBOOT) setup_add ;; EXPIRE|FAIL|RELEASE|STOP) return ;; esac 

ce script reçoit le nom d'hÎte DHCP et nds_servers, nds_tree_name, nds_context et enregistre leurs valeurs dans des fichiers dans un dossier temporaire. Par défaut, l'adresse IP du routeur sera utilisée.

Pour configurer GTK et l'affecter à ceux-ci, créez

 vi /home/user/.gtkrc-2.0 

 gtk-icon-theme-name = "Numix" gtk-theme-name = "Numix" gtk-cursor-theme-name = "whiteglass" 

Pour configurer le gestionnaire graphique LightDM:

 vi /etc/lightdm/lightdm.conf 

 [LightDM] greeter-user=user [Seat:*] greeter-session=my-greeter 

AprÚs avoir expérimenté, j'ai décidé d'utiliser greeter (le programme de connexion), donc je n'aurai pas à configurer la connexion automatique, et le programme démarrera avec le bon utilisateur.

Créez maintenant le raccourci du programme (et son dossier):

 mkdir /usr/share/xgreeters/ vi /usr/share/xgreeters/my-greeter.desktop 

 [Desktop Entry] Name=PyGTK+ Greeter Comment=This runs the PyGTK+ greeter, it should only be run from LightDM Exec=python /home/user/greeter.py Type=Application X-Ubuntu-Gettext-Domain=lightdm 

Et le code de connexion lui-mĂȘme:

 vi /home/user/greeter.py 

Le code suggÚre d'entrer un mot de passe à 4 chiffres 0811 (jour du mois avec des zéros insignifiants sans espaces)
AprÚs une entrée réussie, xfreerdp est lancé avec les paramÚtres reçus.

Code
 #!/usr/bin/env python # -*- coding: UTF-8 -*- from datetime import datetime from gobject import timeout_add import os,sys,gtk,pango,subprocess class GreeterApp: def __init__( self ): self.builder = gtk.Builder() #self.builder.add_from_file("ui.glade") self.builder.add_from_string(ui) self.window = self.builder.get_object ("window") self.pass_field = self.builder.get_object ("pass_field") self.passct = self.builder.get_object ("pass") self.contrl = self.builder.get_object ("control") self.pass_field.modify_font(pango.FontDescription('Sans Bold 36')) self.passwd = datetime.now().strftime("%m%d") self.rdp_server = open("/tmp/rdp_server").read().split(',')[0] self.rdp_user = open("/tmp/rdp_user").read() self.rdp_passwd = open("/tmp/rdp_passwd").read() self.process = None timeout_add(5000, self.timeout) if self.window: self.window.connect("destroy", gtk.main_quit) self.contrl.set_visible(False) self.window.set_size_request(gtk.gdk.screen_width(),gtk.gdk.screen_height()) self.builder.connect_signals(self) def hide(self, widget): self.contrl.set_visible(False) self.passct.set_visible(True) self.window.move(0,0) self.window.set_size_request(gtk.gdk.screen_width(),gtk.gdk.screen_height()) if self.process: self.process.terminate() self.process = None def timeout(self): if self.window: self.window.set_keep_above(True) self.window.set_modal(True) return True def check_pass(self, widget): if self.pass_field.get_text() == self.passwd: self.pass_field.set_text("") self.passct.set_visible(False) self.contrl.set_visible(True) self.window.set_size_request(50,50) self.window.move(0,gtk.gdk.screen_height()-50) #sys.exit() self.process = subprocess.Popen(["xfreerdp","/v:"+self.rdp_server,"/f","/cert-ignore","/u:"+self.rdp_user,"/p:"+self.rdp_passwd]) def clear_pass(self, widget): self.pass_field.set_text("") def num_press(self, widget): self.pass_field.set_text(self.pass_field.get_text()+widget.get_tooltip_text()) def on_destroy(self, widget): sys.exit() if __name__ == "__main__": settings = gtk.settings_get_default() #settings.props.gtk_button_images = True settings.props.gtk_enable_tooltips = False ui = """ <?xml version="1.0" encoding="UTF-8"?> <interface> <requires lib="gtk+" version="2.24"/> <object class="GtkWindow" id="window"> <property name="can_focus">False</property> <property name="type">popup</property> <property name="title" translatable="yes">MyGreeter</property> <property name="resizable">False</property> <signal name="destroy" handler="on_destroy" swapped="no"/> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="can_focus">False</property> <child> <object class="GtkHBox" id="control"> <property name="visible">True</property> <property name="can_focus">False</property> <child> <object class="GtkButton" id="power1"> <property name="use_action_appearance">False</property> <property name="width_request">50</property> <property name="height_request">42</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="hide" swapped="no"/> <child> <object class="GtkImage" id="image4"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="stock">gtk-no</property> </object> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <placeholder/> </child> <child> <placeholder/> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> <property name="can_focus">False</property> <child> <object class="GtkTable" id="pass"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="n_rows">6</property> <property name="n_columns">3</property> <child> <object class="GtkEntry" id="pass_field"> <property name="width_request">240</property> <property name="height_request">60</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="visibility">False</property> <property name="invisible_char">●</property> <property name="xalign">1</property> <property name="invisible_char_set">True</property> <property name="primary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property> <property name="primary_icon_sensitive">True</property> <property name="secondary_icon_sensitive">True</property> </object> <packing> <property name="right_attach">3</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_0"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">0</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_0"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">0</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_1"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">1</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_1"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">1</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_2"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">2</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_2"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">2</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_3"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">3</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_3"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">3</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_4"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">4</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_4"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">4</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_5"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">5</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_5"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">5</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_6"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">6</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_6"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">6</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_7"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">7</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_7"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">7</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_8"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">8</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_8"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">8</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_9"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">9</property> <signal name="clicked" handler="num_press" swapped="no"/> <child> <object class="GtkLabel" id="l_9"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">9</property> <attributes> <attribute name="weight" value="bold"/> <attribute name="size" value="40000"/> </attributes> </object> </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_ent"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="check_pass" swapped="no"/> <child> <object class="GtkImage" id="image2"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="stock">gtk-yes</property> </object> </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> <child> <object class="GtkButton" id="b_del"> <property name="use_action_appearance">False</property> <property name="width_request">80</property> <property name="height_request">80</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="clear_pass" swapped="no"/> <child> <object class="GtkImage" id="image3"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="stock">gtk-no</property> </object> </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_SHRINK</property> <property name="y_options">GTK_SHRINK</property> </packing> </child> </object> <packing> <property name="expand">True</property> <property name="fill">False</property> <property name="position">0</property> </packing> </child> </object> <packing> <property name="expand">True</property> <property name="fill">False</property> <property name="position">1</property> </packing> </child> </object> </child> </object> </interface> """ app = GreeterApp() app.window.show() gtk.main() 


Le code est fourni Ă  titre d'exemple - vous pouvez simplement entrer un nom d'utilisateur et un mot de passe pour une connexion RDP, sĂ©lectionner des serveurs, surveiller des serveurs et tout ce dont votre imagination est capable - mĂȘme la saisie d'empreintes digitales.

Source: https://habr.com/ru/post/fr420099/


All Articles