# Shell

### SSH

* `ssh` to see if ssh is installed (openssh-client is installed by default)
* `ssh-keygen` or `ssh-keygen -t rsa` generate ssh key by RSA algorithm
* `cat ~/.ssh/id_rsa.pub` print public key (for settings on Github)
* `ssh -T git@github.com` testing
* `sudo apt-get install openssh-server` install server for incoming ssh connections
* `ssh-copy-id username@hostname` copy your ssh key to remote computer to avoid verifying password on every connection
* `ssh username@ip` ssh login to a remote computer with this ip and username
* `ssh username@hostname` if mapped this hostname to its ip in /etc/hosts file
* `ssh -X username@hostname` login with GUI support
* `ssh -p 1234 username@hostname` login via port 1234
* `sudo gedit /etc/hosts` modify hosts file
* `sudo gedit /etc/ssh/sshd_config` modify ssh server configuration

### Devices and Filesystem

* `sudo gparted`
* `ls -l /dev/ttyS0`
* `groups <username>`
* `sudo gpasswd -a <username> <groupname>`
* `sudo gpasswd -d <username> <groupname>`
* `sudo groupadd <newgroupname>`
* `sudo usermod -a -G <groupname> <username>`
* `lscpu` , `lsmem` , `lshw` list CPU, memory, hardware info
* `lsusb` list USB devices
* `lsblk` list block devices, often used to check external ssd
* `lspci` list PCI devices
* `lspci | grep VGA` check GPUs
* `sudo lshw -C video` check GPU display details
* `du -h -d 1` check file size/usage in current directory
* `df -h` check hard disk usage

### Environment Variables

* `which pip` to see which `pip` command you are running - useful for checking environment!
* uncomment `#force_color_prompt=yes` in `.bashrc` for a colored prompt
* `sudo !!` where `!!` is for the last command
* `python3 -m site` show searching path for python3
* `sudo python -m pip install --force-reinstall pip==8.1.1` if you [inadvertently upgraded your system pip](https://stackoverflow.com/questions/49836676/error-after-upgrading-pip-cannot-import-name-main). More info can be found at [this link](https://stackoverflow.com/questions/50776299/how-to-downgrade-pip-version-10-0-0-to-pip-version-9-0-1), and [this link](https://github.com/pypa/pip/issues/5221#issuecomment-382069604).
* `sudo ldconfig` after `sudo make install` to refresh the cache

### Date and Time

* `date`
* `sudo systemctl stop systemd-timesyncd`
* `sudo systemctl start systemd-timesyncd`
* `timedatectl`
* `sudo timedatectl set-ntp false`
* `sudo timedatectl set-time 'YYYY-MM-DD'`
* `sudo timedatectl set-time 'YYYY-MM-DD HH:MM:SS'`

### Network

* `sudo systemctl restart network-manager`
* `nmap -sP 192.168.0.1/24` scan ports
* `nmap -A 192.168.10.112` detect OS and services

### Compression

* `tar -cf filename.tar file1 folder2` packed without compression
* `tar -xf filename.tar`  create an archive by `-c`, extract an archive by `-x`
* `tar -cvzf filename.tar.gz file1 folder2` compress by `-z`; verbose by `-v`
* `tar -xvzf filename.tar.gz`  decompress
* `tar -xvzf filename.tar.gz -C {path}` decompress to a designated path
* `sudo apt-get install zip unzip`
* `zip -r archive_name.zip myfolder`
* `unzip archive_name.zip`

### running in the background

* `Ctrl + Z` to stop the process, followed by `bg` to run in the background or `fg` to run in the foreground.
* Use command `./test.sh 1>stdout.log 2>stderr.log &` and it will return a process ID.&#x20;
* Processes running in the background can be monitored by `top` command.&#x20;

### apt commands to find dependencies ([link](https://askubuntu.com/questions/13296/how-do-i-find-the-reverse-dependency-of-a-package))

* `apt-cache showpkg <pkgname>` show package info, both depends and reverse depends
* `apt-cache depends ros-melodic-desktop` show one-level dependencies
* `apt-cache rdepends --installed ros-melodic-desktop`&#x20;
* `sudo apt install apt-rdepends`
* `apt-rdepends ros-melodic-desktop | pager` recursively show all dependencies&#x20;
* `apt-rdepends --reverse protobuf-compiler | grep ros-melodic-desktop` &#x20;

### apt commands to locate packages

* `dpkg -L <package-name>`
* `apt list <package-name>`
* `apt-cache madison` &#x20;
* `locate <filename>` find a file in database (globally)
* `find <filename>` find a file in local directory

### vim commands

* `vi -b <filename>` open file in binary mode
* `:%!xxd` switch to hex mode
* `:%!xxd -r` switch back to binary mode
* `:wq` save and exit

### terminal

* `sudo update-alternatives --config x-terminal-emulator`

### References

* [The Unix Shell](http://swcarpentry.github.io/shell-novice/)
* [How do I find the reverse dependency of a package?](https://askubuntu.com/questions/13296/how-do-i-find-the-reverse-dependency-of-a-package)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.hanzheteng.com/development/linux/shell.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
