Tips for using SSH effectively on Raspberry Pi

SSH is a common secure type of remote connection to access to servers or other computers in the same or different network, it's important to remember this few tips for using SSH effectively; you will need it to connect to your Raspberry PI if you don't use a display.
Let's see a few of them:

  • The two-factor authentication for SSH.
  • Use safe agent-forwarding.
  • Exit out of SSH session.
  • leave the terminal open on disconnecting.
  • share a remote connection with friend mates.





Let's start with the first point, you will see that there are different ways to add a second factor for SSH authentication and ensure in this way your connection.


1.- Use hardware tokens (USB Key).

Around February 2020, support for Universal Second Factor tokens was added to OpenSSH connection. This is a great new feature, but there are thinks that we have to consider before to use it.

Around February 2020, support for Universal Second Factor tokens was added to OpenSSH connection. This is a great new feature, but there are thinks that we have to consider before to use it.

Since this update adds new key types to support tokens, it can only be used if you update both the client and server. The current version of the client can be checked with the command ssh -V, for the remote server it depend of the OS, check your OS information to know who to check it.

Two new types of keys were added - ecdsa - skand ed25519 - sk . To create key files, insert your token into your computer and run the command$ ssh -keygen -t ecdsa-sk -f This command will create the public and private keys associated with your token. The private key on the device is used to decrypt the private key file stored on disk.

Also, as a second factor, you can set a password for key files. OpenSSH supports another variant of key generation, a'resident' key. In this case, key files are stored on a token. This way, you will always have your keys with you. 

To transfer a key file to a new machine, insert the key media and execute the command ssh-add -k. You will need to activate your token.

More information: https://www.ssh.com/ssh/key/



2.- Safe use of agent forwarding (UNTIL HERE, DRAFT)

SSH key forwarding gives remote host access to your local SSH agent. When your SSH client uses key forwarding, there are 2 channels in the connection:

- Your interactive session.
- The key forwarding channel.

The local SSH agent creates an IPC socket that connects to the remote host through this channel. This is dangerous because a root user on the remote host has access to your local SSH agent and can potentially use it to access network resources on
your behalf. With the standard SSH agent that comes with OpenSSH, you will never know what happened. But if you use a U2F key, you will be able to stop any attempts to use your SSH agent.

Even with this limitation, periodic use of key forwarding is perfectly acceptable.

Do not use this method for all of your connections. Use it only if you are sure you need it in specific situations.


3.- Exit out of SSH session

SSH sessions often hang due to network interruptions, loss of control of a program being executed, or one of the terminal escape sequences that block keyboard input.

Here are some ways to get out of a frozen session:

Automatic logout in case of network failure.

In your SSH configuration files [.ssh/config] you need to add the next command:

ServerAliveInterval 5
ServerAliveCountMax 1

ssh will test the connection by sending echo requests to the remote host every ServerAliveIntervalseconds. If more than ServerAliveCountMaxsuch requests go unanswered, SSH will close the connection.

In this situation you will have sure about the current situation in your server to avoid that any ssh connection remains open without your control.

Terminate the session.
SSH uses a character ~ as the default escape sequence. The command ~ closes the current connection and returns to the terminal.
(remember that you can enter escape sequences only on a new line).

The command  ~? displays a list of commands that can be used in the current session. If you have a keyboard with multiple languages, you may have to press the button ~ twice to send this character.

Leave the terminal open on disconnecting

There are two options for how to save the session when you switch between networks or want to disconnect for a while:

Use Mosh or External Terminal.

If you really need a connection that doesn't drop even if you switch between networks, use Mosh - the mobile shell. Mosh is a secure shell that uses SSH to initialize a session and then switch to its own encrypted channel. This channel is very stable. It can handle a variety of situations, including internet disconnects, changing your laptop's IP address, high network latency, and more.

To use Mosh, you need to install it on both your server and client and open ports for incoming UDP traffic on your remote host. Then just dial mosh user@server connect.

Mosh works at the level of terminal screens and keystrokes, and this gives it many advantages over SSH, which transfers a binary stream of standard I/O between the client and server. If we need to synchronize only the terminal screen and keystrokes, then the interrupted connection can then be restored much faster. SSH would have to buffer and forward whatever happened, while Mosh would only need to store the keystrokes and synchronize the last state of the terminal window with the client.

More information: https://mosh.org/ 

Use tmux.

If you want to connect and disconnect as you please and keep the same session on the remote host, use the tmux terminal. If your SSH connection drops, just connect again and type tmux attach to return to your session tmux. It has some great additional features in tabs and panels, the same as in the macOS terminal and the ability to share the terminal with friends.

Some people improve tmux with Byobu, a package that adds many handy functions and keyboard shortcuts. Byobu ships with Ubuntu and is easy to install on macOS via the Homebrew package manager.

Read more: 
https://phoenixnap.com/kb/tmux-tutorial-install-commands#:~:text=Tmux%20is%20a%20Linux%20application,reattach%20to%20a%20running%20process.



Share a remote connection with friends:

When solving a complex problem in servers in different task, It would be useful to share the SSH session with someone else who is in a different location.

tmux is the best terminal sharing tool for that. So, you need to do the following:

Make sure it is tmux installed on your server.

You both need to connect to the server via SSH using the same account.
One of you must run tmux for the tmux session to be created .
Another has to execute the command tmux attach.

Source:  https://github.com/tmux/tmux/wiki

It's done ! You have shared the terminal.



Best Raspberry Pi HATs

I fount and article talking about different hat's that you can plug into a Raspberry Pi, I'll create a new page in this blog to collect all information, sources, and utilities of using this hat's; I don't use anyone of them so I can't talk about my own experience; I'll add my feedback once I have the choose to use them. 

This is the wish list:

  • Sense Hat; Acceleratometer, Magnetometer, Air Pressure and a few more
  • Automation Hat; plug and play with diferent type of outputs.
  • Pimoroni Unicorn; Just a led matrix hub, I don't like them a lot because you have tu put very close to the raspberry.
  • Adafruit Servo; as the name tell, control your step and servo motors.
  • pHat Beat; just a little Sound board.
  • HifiBerry DAC; co convert the digital signal to analog.
  • PoE Hat; if you would like to power on your raspberry over the internte, you need this. it's in my wish list.
  • Cluster Hat;to create server cluster
  • Uptime UPS; A funny solution to use as a external battery to protect and power your raspberry if there is any cut in the main power supply.
Links to the page with more detailed information cumming soon:


Next Raspberry Pi 400 board

Picture from pimoroni

We have a new board option in the Raspberry PI family, this new Raspberry Pi 400 is a new design option that offer the user the experience to have integrated in the same keyboard a new raspberry pi 400.


 

After around a year of the last Raspberry pi P4 release, this is a good new for ones and a huge deception for others.

The board is more powerful than the old PI4, and the case is itself a user keyboard in the same "case", as the new board is not squares, all the connectors included the GPIO are available in the same side, that makes this new system more accessible than other boards.

From a point of view of headless System, what we can say, the keyboard it’s totally useless if we follow the headless installation to put the raspberry as a server, as a IOT System, as a spy cam or similar; maybe we will see new plastic cases without he keyboard for a different use, but, it seams that this board don’t have the option to plug a camera directly to the board, you will need to plug it trough USB if you need one.

This new product is more oriented for kids that would like to play with a Linux  computer, it can be more accessible that other computers and/or laptop because you only need to plug the micro SD in the raspberry, plug the HDMI to a tv and start using it. I found it quit expensive compared if you acquired for example the P4 board with an external keyboard, I miss for example an display like we can see in old ebooks and the touch pad to avoid the use of the mouse; if this is a product for help kid to learn about computers, programming, etc… 

You can check it from Pimoroni web site:
https://shop.pimoroni.com/products/raspberry-pi-400-personal-computer-kit?variant=32280730206291
 

Why not to invest in a small and cheapest PI4 rather than more different boards ?

Xmas season, new staff to make gif to our geek friends.


Using scrapy in raspberry pi with python

Problem:

You need to extract some information from a public website an process it to do "thinks"

Solution:

One solution is to use a web scrap tool, to let you know who it works, lets see a simple example to extract metada from  single url in a single program.

1.- Install scrappy and resolve any dependence issue, maybe you need to upload crypto library [sudo pip3 install cryptography==2.8]

sudo pip3 install scrapy

2.- Check scrappy release

scrapy version

3.- Use the next code in file "myscrapbot.py"

#get links from a single page without jump
import scrapy
class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'https://raspberrypihack.blogspot.com/',
    ]
    def parse(self, response):
            yield {
                'enlaces': response.xpath('//a/@href').extract(),
            }

4.- Run the program using "scrapy"

scrapy runspider myscrapbot.py -o export.json
4.- The data selected to be scraped will be saved in file export.json

5.- How to extract data from a data base table urls

First, you have to checl the disscussion in this post.

Then you have to addapt the code using this post recomendation from the first answers.

import scrapy

import mysql.connector

class ProductsSpider(scrapy.Spider):
    name = "Products"
    start_urls = []
    def parse(self, response):
 
      print(self.start_urls)
         yield {
              'enlaces': response.xpath('//a/@href').extract(),
        }
    def start_requests(self):
        conn = mysql.connector.connect(
                user='user',
                passwd='_a30e4qK',
                db='DDBB',
                host='localhost',
                charset="utf8",

                use_unicode=True
                )
        cursor = conn.cursor()
        cursor.execute('SELECT links FROM CUSTOMERS;')
        rows = cursor.fetchall()
        for row in rows:
           ProductsSpider.start_urls.append(row[0])
           yield self.make_requests_from_url(row[0])
        conn.close()




X.- How to extract href data?

response.xpath('//a/@href').extract()
response.xpath('//a/text()').extract()
more will continue soon...


Source:

Connect to MySQL using Python

Problem:

You need to connect to a external MySQL database and do thing...

Solution:

1.- Install mysql drivers

sudo python3 -m pip install mysql-connector-python

2.- Create a new program using the next code:
import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
for x in myresult:
  print(x)

Sources:

3.- Do thinks... 

https://www.w3schools.com/python/python_mysql_getstarted.asp

Raspberry Pi 4 release 1.1 or 1.2 ? what is the diference ?

Problem:

You need to know the correct release of your Raspberry Pi but it's not possible to identify it in the board, neither the storage box neither the product technical documentation.

Solution:

Run the next command:

cat /proc/cpuinfo

Check the information in the source link to identify the release of your model using the map table in the official Raspberry Pi website

Source:

https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md

 

How to connect a OLED display with a Raspberry Pi

Problem:

You would like to use a OLED display with a I2C interface with a Raspberry pi using a SH1106 controller , 

Solution:

That type of OLE Display have 4 connections, just follow the next wire schema to connect it to the Raspberry.

Connect the wires directly between the oled display and the Raspberry:

OLED pins >> Raspberry Pi

VDD >> 5V

GND >> GND

SCK >> SCL  ( more information )

SDA >> SDA  ( more information)

*Check the panel in your OLED display to ensure the correct pin definition in the oled panel 

Setup the software:

Activate the I2C Interface option in system configuration, use the command raspi-config and go to interface settings, there you will fine the I2C option.

Install libraries:

Just use the following command: 

sudo apt-get install -y python-smbus 
sudo apt-get install -y i2c-tools
sudo apt-get reinstall build-essential
sudo apt-get install i2c-tools
$ sudo apt-get update
$ sudo apt-get install python3 python3-pip python3-pil libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libopenjp2-7 libtiff5 -y
$ sudo -H pip3 install luma.oled

Check if the system detect it:

You can check it if you find signal in this interface map, use the
command: sudo i2cdetect -y 1

If it works, you will see something like this:



Working with the Oled and Python:
1.- Clonning the exmaple repository:
$ git clone https://github.com/rm-hull/luma.examples.git
$ cd luma.examples

2.- install libraries
sudo -H pip install -e .

3.- run examples
cd examples
sudo python3 3d_box.py

Hardware: