buhfur

For all things in my brain

View on GitHub

Linux notes for reference

In this document I have added various bash snippets ,tips , and other useful pieces of knowledge that might help me navigate the insane POWAH of linux.


Command & Bash snippets

Remove file with hyphens in the name

rm -- -filename

or

rm ./--filename

Start comand as background job

command &

Add an ampersand at the end of the command

Type jobs to view your background tasks

use fg by itself to bring the most recently started background job to the foreground of the console. From there you can stop the job using Ctrl-Z or Ctrl-C

List largest files in current directory

du . | sort -nr | head -n10

List largest directories in current directory

du -s * | sort -nr | head -n10

Change file extension of all files in director

rename 's/\.foo$/.bar/' *.foo

replace foo with the current extension , replace bar with the new ext.

Show keycode for keybind

If you’re using Xorg as your display server, xev should already be installed. This tool let’s you see what keycode goes to what key.

xev

After finding the keycode, run this command below. Substitute <KEYCODE> with the numerical keycode you retrieve from xev.

xmodmap -pk | grep <KEYCODE>

Show info about hard drives connected

find /dev/disk/by-id/ -type l|xargs -I{} ls -l {}|grep -v -E '[0-9]$' |sort -k11|cut -d' ' -f9,10,11,12

Show otherboard info

dmidecode -t 2

Disable trackpad on linux

sudo apt-get install xinput

then find your touchpad with xinput list. Alot of the time trackpads are labeled with “SynPS/x Snynaptics TouchPad”. Locate the ID in the second column and do the following command below.

xinput --disable <ID>

List all users on host

compgen -u | column

Restore default .bashrc, .profile

The default versions of these files are stored in

/etc/skel/

To restore these files

source /etc/skel/.bashrc

or

source /etc/skel/.profile

or

source /etc/skel/.bash_logout

Show motherboard info

dmidecode | less

Get CPU info

lscpu

or

cat /proc/cpuinfo

Get disk info

lsblk -o +MODEL,SERIAL,WWN

or

ls -l /dev/disk/by-id

or

lsblk |awk 'NR==1{print $0" DEVICE-ID(S)"}NR>1{dev=$1;printf $0" ";system("find /dev/disk/by-id -lname \"*"dev"\" -printf \" %p\"");print "";}'|grep -v -E 'part|lvm'

Reduce text entering sensitivity

You can either use kbdrate or xset , preferably xset as it works alot easier

Enter this line in your xinitrc , or just copy the xinitrc from the ~/dotfiles directory to your local .xinitrc

xset r rate 250 60

This will reduce the sensitivity


Xinitrc

the xinitrc file is used for loading additional configurations and settings when the Xorg server starts

Manually disable the caps lock ( lock , not the button itself)

Install numlockx and run this command

python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'

Add aliases for ssh connections

Add two lines for each host , one being the IP and the port you want to use

vim ~/.ssh/config

Add these two lines to the ~/.ssh/config file

Host xxx.xxx.x.x

Port xxx

Then add the IP addresses for the ssh hosts to the /etc/hosts file with the format below

IPADDR hostname

Create swap file

step 1 : use dd to create the file using the /dev/zero device

dd if=/dev/zero of=/swapfile bs=1M count=100

step 2 : convert file to swapfile

mkswap /swapfile

step 3 : swap to the newly created swap file

swapon /swapfile

step 4 : mount the file in /etc/fstab

Add this line to the bottom of your /etc/fstab file

/swapfile none swap defaults 0 0

This will mount the swap file automatically after boot


Tips & tricks

Below is some useful info for different services and how they can be enabled / modified.

Installing Network Manager on Debian 12

One of the issues while installing NetworkManager lies with a preset network configuration by the system. Specifically the file /etc/network/interfaces is configured automatically and for some reason if this is present you will see an error in STDERR when installing asking you to remove the configuration if you want to use Network manager to manage any connections.

Simply delete all lines in /etc/network/interfaces and re-install the package and the systemd service file should be present and should allow you to activate it.

ProtonVPN connections

Change the file extension to a .conf file , then copy the file over to /etc/openvpn. This will start a daemon for every connection in the directory


Setting up torrent server vm

Put ovpn file in /etc/openvpn

install openvpn-systemd-resolved and network manager


Redirect both STDOUT and STDERR

command &> /dev/null

or

command > /dev/null 2>&1


Piping

0> = STDIN 1> = STDOUT &> = STDOUT & STDERR 2> = STDERR


add timestamp to tar archive

tar -zcvf "$(date '+%Y-%m-%d').tar.gz"


tar snippets

List contents of archive

tar -tf archive.tar

Add file to archive

tar -rf backup.tar file

Backup entire system with timestamp

Note : it’s a good idea to exclude sys, mnt , and proc as they can cause a backup to freeze. None of these directories should be necessary for archival anyways

tar pzvxf --exclude=mnt/ --exclude=sys/ --exclude=proc/ /backup/"$(date '+%Y-%m-%d').tar.gz" --one-file-system /


Systemd

Creating service files that involve X org server If you need to create a service that depends upon an X server running , add this line under the “Unit” section

PartOf=graphical-session.target

Also you will want to add this line under the “Install” section

WantedBy=xsession.target

Boot into different target

cd /usr/lib/systemd/system

grep Isolate *.target

Decide which target you would like to use , then run systemctl isolate

systemctl isolate something.target

Start systemd service under specific User ID

systemctl --user service.name

Change user systemd service to start on system startup

loginctl enable-linger myuser

Running scripts at startup

There are many ways to do this , assuming you are using systemd. You can use the following methods to run a script on boot.

Rc.local

add this line in the /etc/rc.d/rc.local file

sh /home/user/scriptdir/script.sh

systemd unit file

Use the template below for your script , put this inside /etc/systemd/system

[Unit]
Description=Reboot message systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/ec2-user/reboot_message.sh

[Install]
WantedBy=multi-user.target

Set perms for the service file

chmod 644 /etc/systemd/system/script.service

Then enable the service file in systemd

systemctl enable script.service

Crontab

edit the crontab file

crontab -e

To run the script on reboot, use the template below

@reboot sh /home/user/reboot_message.sh

WARNING : Not all versions of cron support the ‘@reboot’ option

init.d

Make a script and put it in /etc/init.d/

Use the template below :

! /bin/sh
# chkconfig: 345 99 10
case "$1" in
  start)
    # Executes our script
    sudo sh /home/user/script.sh
    ;;
  *)
    ;;
esac
exit 0

xrandr

Put xrandr configurations in ~/.xprofile

move monitor to the right of another

xrandr --output <DISPLAY-OUTPUT-1> --right-of <DISPLAY-TWO-2>

change refresh rate of monitor

xrandr --output <DISPLAY-OUTPUT> --mode <DISPLAY-RESOLUTION> --rate <REF-RATE>

Put this line in the ~/.xprofile file for configuration on startup ( happens late in the boot process )

Change background picture with feh

create a ~/.fehbg file with your feh command

feh --bg-fill /home/user/something.jpg

Then put this line in your ~/.xinitrc file

~/.fehbg &

bash difference between $() and ${}

”${}” :

echo ${var} something

”$()” :

echo "Path $(basename /home/user/Downloads)

use find to only list dotfiles

find . -maxdepth 1 -type f -name ".*"

Change extensions of all files in dir

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;

Replace .txt with the current ext and replace .txt_bak with the ext you are trying to set it to

add text to specific line with sed

For this example I wanted to update a bunch of openvpn config files to change only one line , being the ‘auth-user-pass’ and put in the location where my creds are stored

Below is the command I used

sed -e '/auth-user-pass/ s/$/ \/opt\/scripts\/login.conf/' ./*

nmcli & Networking

show all open net conns

sudo netstat -nlp

show service being used by specific port

Shows services using port 80

lsof -i tcp:80

Remove Secondary IP for host

nmcli con mod <con-name> -ipv4.addresses "<IP>" Add Wifi Connection

nmcli device wifi connect <AP name> password <password>

Create new network connection in nmcli

nmcli con add con-name static ifname ens18 autoconnect no type ethernet ip4 10.0.0.10/24 gw4 10.0.0.1 ipv4.method manual

Bring up network connection with nmcli

nmcli con up <con-name>

Switch to DHCP with nmcli

nmcli con up dhcp

change connection to not connect automatically with nmcli

nmcli con mod <con-name> connection.autoconnect no

Add DNS server to connection with nmcli

nmcli con mod <con-name> ipv4.dns <dns-server-ip>

To add additional dns servers

nmcli con mod <con-name> +ipv4.dns 8.8.8.8

Change IP for existing connection in nmcli

nmcli con mod <con-name> ipv4.addresses <ip-address>/<CIDR-prefix>

Add secondary IP addresses with nmcli

nmcli con mod <con-name> +ipv4.addresses <new-ip>/<CIDR-prefix>

After chaning any properties to a connection you must re-activate the connection

nmcli con up <con-name>


SELinux

Put SElinux into disabled mode in grub

Put this line into your kernel boot args

selinux=0

Put Selinux into enforcing mode in grub

add this to kernel boot args

enforcing=0

View selinux config

cat /etc/sysconfig/selinux

Check what mode selinux is running

getenforce

Switch between selinux modes temporarily

permissive mode

setenforce 0

enforcingm mode

setenforce 1

Switch modes persistantl

modify /etc/sysconfig or add kernel boot arg

Get status of selinux

sestatus

Get more detailed info

setstatus -v

Show context setttings

using ls

ls -Z

using ps

ps Zaux

using ss

ss -Ztul

Setting Context types

Add context type to manually created directories

semanage fcontext -a -t <contxt-type> "/mydir"

Apply policy settings

restorecon -R -v /mydir

Help with setting contexts

man semanage-fcontext

type “/example”

Finding context types

Install selinux-policy-doc package

dnf -y install selinux-policy-package

man -k _selinux

Enable ssh port in SELinux

semanage port -a -t ssh_port_t -p tcp PORTNUMBER

Relabel entire filesytem

restorecon -Rv /

or create a file /.autorelabel works after server restart, afterwards the file will be removed


Managing Port Access

Example: Changing port of apache

semanage port -a -t http_port_t -p tcp 8008

Template

semanage port -a -t <context-type> -p <tcp/udp> <port>

run restorecon afterwards to apply changes

Using Boolean Settings to Modify SELinux Settings

get list of booleans on system

getsebool -a

semanage boolean -l

Change Boolean example

setsebool ftpd_anon_write on

Template

setsebool <context-rule> <on/off>

Apply permanant changes to boolean

setsebool -P

Diagnosing and Addressing SELinux Policy Violations

audit log

The audit log is stored in /var/log/audit/audit.log

Messages are logged with the type=AVC in the log.

You can search for these messages through grep

grep AVC /var/log/audit/audit.log

“avc: denied { map } “ indicates a map request was denied , therefore some process tried to read attributes of a file and that was denied. Thus triggering a policy violation

in this logging , the scontext is the source context while the tcontext is the target context

Making SELinux Analyzing Easier

Download the sealert command

dnf -y install setroubleshoot-server

Then restart your server

Then you can grep for entries from sealert

journalctl | grep sealert

From the info you get , you might see a command it recommends to run to see furtheri nfo.

sealert -l <SOME-ID>

Sometimes the logging will even recommend other commands to run in order to fix the issue, take these commands with a grain of salt unless you know what you are doing .

These recommendations will have a confidence score

Key topics about selinux


DNF

Search for RPM’s of specific tool

dnf whatprovides */semanage

dnf whatprovides


Firewalld

View all available services

firewall-cmd --get-services

Get default zone

firewall-cmd --get-default-zone

Get available zones

firewall-cmd --get-zones

List services

firewall-cmd --list-services

List services enabled in zone

firewall-cmd --list-all --zone=public

Add port to firewalld permanently

firewall-cmd --add-port=2020/tcp --permanent

Add service to firewalld

firewall-cmd --add-service=vnc-server --permanent

Reload firewalld

firewall-cmd --reload

Write configs to runtime

firewall-cmd --runtime-to-permanent

Add source IP

firewall-cmd --add-source=<ipaddress/netmask>


NFS

Setup NFS on RHEL 9

create local directories to be shared

mkdir -p /nfsdata /users/user1 /users/user2

Create /etc/exports file and assign the following

/nfsdata *(rw,no_root_squash)
/users *(rw,no_root_squash)

Install the cifs-utils package

dnf install -y nfs-utils

Add the nfs , rcp-bind, and mountd services to firewall

firewall-cmd --add-service nfs --permanent ; firewall-cmd --add-service rpc-bind ; firewall-cmd --add-service mountd --permanent

Then reload the firewall-cmd config

firewall-cmd --reload

List available mounts from IP or hostname

showmount -e <IP-or-hostname>

Perform pseudo root mount

mount <Ip-Or-hostname>:/ /mnt


NTP

Turn on NTP

timedatectl set-ntp 1

Commands to manage time on RHEL 9

date - manages

Commands to manage time on RHEL 9

date - manages local time

hwclock - manages hardware time

timedatectl - developed to manage all aspects of time

Convert epoch time to human time

date --date '@1720893005

Show the current system day of month, month , and year

date +%d-%m-%y

Set the current time 3 minutes past 4 pm

date -s 16:03

Using hwclock

hwclock --systohc - synchronizes curent system time to the hardware clock

hwclock --hctosys - synchronizes current hardware time to the system clock

timedatectl commands

status - shows current time settings

set-time TIME - sets the current time

set-timezone ZONE - sets the current timezone

list-timezone - shows a list of all time zones

set-local-rtc [0|1] - controls whether the RTC ( hardware clock )

set-ntp [0|1] - Controls whether NTP is enabled

timedatectl is used to switch on NTP time , it talks to the chronyd process


Podman

Run container in detached mode

podman run -d nginx

Run container in TTY mode

podman run -it nginx /bin/sh

View running containers

podman ps

View all inactive and active containers

podman ps -a

Attach to running container

podman attach <name>

Stop running container

podman stop <name>

Search which registries are currently used

podman info

Filter images in search

podman search --filter official=true alpine

podman search --filter stars=5 alpine

Pull image

podman pull <image>

Build custom image

podman build -t imagename:tag -f /path/to/Containerfile

Example :

podman build -t mymap:1.0

Verify custom image was built

podman images

Remove images with None tag

podman image prune

Managing Containers

podman stop - sends SIGTERM signal to the container , if no results after 10 seconds , the SIGKILL signal is sent.

podman kill - immediately sends the SIGKILL command

podman restart - restarts container

podman rm - removes container files written to the writable layer

podman run --rm - runs the container and deletes container files automatically

Running Commands inside containers

podman exec mycontainer uname -r

TTY MODE:

podman exec -it mycontainer /bin/bash

Managing Container Ports

ports 1-1024 are accessible by the root user only

To run a container with port forwarding , run the following command below

podman run --name nginxport -d -p 8080:80 nginx

This would allow the nginx process to access host port 8080 and forward to standard http port 80

After adding the port , don’t forget to add the port to your firewall

Managing Container Environment Variables

For containers such as mariadb , you will need to supply the container with environment variables. For example the mariadb container needs the password for the root user

Some containers contain a “usage” line that may say how the container needs to run with environment variables included. However this is not always the case, you can check the container with podman inspect to see if it’s there.

Here’s an example on how to use env variables with the mariadb container

podman run -d -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=anna

Managing Container storage

If you want to save the changes made in the writable layer , you will need to configure persistant storage.

You can do this by adding a bind-mount from the host OS into the container, this is used instead of a block device

There are 2 requirements to doing this however :

NOTE: The bind-mount dir must be OWNED by the user that runs the container

If not done automatically , you can do it with the cmmand

semanage fcontext -a -t container_file_t "hostdir(/.*)?"; restorecon

To do so automatically :

-v host_dir:container_dir

If root container or if user is owner of the container

-v host_dir:container_dir:Z

set directory ownership on bind-mounted directories for rootless containers

  1. Find UID of the user that runs the container main app , using podman inspect imagename

  2. Use podman unshare chown nn:nn dirname to set the container UID as the owner of the directory on the host. This directory must be in the rootless user home dir. Otherwise it woulden’t be apart of the user namespace.

  3. Use podman unshare /cat/proc/self/uid_map to verify the user ID mapping

  4. Verify that the mapped user is owner on the host by using ls -ld ~/dirname

Running Containers as Systemd Services

podman generate systemd --name mycontainer --files

The Container file must be generated in the ~/.config/systemd/user/directory

Create this dir and CD to it before running the podman generate command

Then run systemctl --user enable containe-mycontainer.service


GRUB

Reset root password without access to wheel group

  1. Boot into GRUB boot args

  2. Remove the “rhgb” and “quiet” from the options

  3. add “init=/bin/bash”

  4. then mount the filesystem as writable

mount -o remount,rw /

  1. Then change the password for root with passwd root

  2. Then enable SELinux relabeling on next boot

touch /.autorelabel

  1. then reboot the system

/usr/sbin/reboot -f


User management

View user ID

id -u <username>

Change password validity to 90 days

passwd -n 30 -w 3 -x 90 username

The “-n” sets minimal usage period

“-w” sets the days the user will be warned before their password expires

“-x” sets the amount of days until the password expires

You can also do this with chage by setting an exact date

chage -E 2025-12-31 username

You can find the amount of days until the password expires with chage -l username or by viewing the /etc/passwd file

Change default password expiration

open the /etc/login.defs file

change PASS_MAX_DAYS to the number of days before the password expires

Add default directories for newly created users

cd /etc/skel

in this directory

Change default .bashrc

Edit the .bashrc file in /etc/skel This bashrc will be used for all created users

Change default UUID for new users

Edit the UID_MIN file with the default UID new users

View what groups a user is apart of

lid username

Add user to group

usermod -aG <group-name> <username>

Change UID of user

usermod -u <NEWUID> username

Configure user to be unable to start interactive shell

usermod -s /sbin/nologin username

Configure directory to have access from one group

Change group owner of dir

chown -R :groupname /dirname

Change permissions for group on dir

This example allows full access to the dir for the group members

chmod g+rwx /dirname

Configure dir where new files are owned by group

Set the SGID on the directory

chmod g+s /dir

Change username of user

usermod -l [new_user] [old_user] or sudo usermod -l faruk -d /home/faruk -m pardus


Package management with DNF

Add installation disk as repo

dnf config-manager --add-repo=file:///repo/filename

Then locate the repo in /etc/yum.conf.d

add the ‘gpgcheck=0’ to the file


Logical Volume Managment

View volume groups extent size

vgdisplay

Create VG with specified extent size

vgcreate myvg /dev/sdx -s 8MiB

The example above creates a volume group with a Physical Extent size of 8-MiB

Create logical volume with specific size

lvcreate -n lvdata -l 50%FREE vgdata

lvcreate -n lvdata


Stratis

Install stratis package


CIFS

Enable CIFS mounts for user

Set the SUID perm on these binaries

/bin/mount /bin/umount /user/sbin/mount.cifs

sudo chmod u+s /bin/mount /bin/umount /usr/sbin/mount.cifs

CIFS default ports

CIFS uses ports 138 for clients , 139 & 445 for servers


NMAP

Scan for all IP’s on your network with nmap

nmap -sn 192.168.0.0/24

You can substitute the ip in the command above for one or multiple networks

The ‘-sn’ option tells nmap to not search for open ports

Check if certain port is open

nmap <ip><prefix> -p <port-number>

If you know the port the service might be using

lsof -i :<port>

Or alternatively , you can use netstat

sudo netstat -nlp | grep <port-number>


GRUB

Update GRUB config

grub2-mkconfig -o /boot/grub2/grub.cfg grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

reset root password

add init=/bin/sh in GRUB kernel boot args

remount filesystem for writing

mount -rw -o remount /

use passwd to change pass

passwd root

Then add /.autorelabel command for SELinux , without doing this you will not be able to login at all !

touch /.autorelabel


Common errors and small fixes

Error: org.bluz.Error.NotReady

You can fix this using the rfkill tool

sudo rfkill unblock all


Docker

list docker networks

sudo docker network ls

delete all docker containers

docker rm vf $(docker ps -a -q)

Add bind mount to docker container

You can use the “-v” option when making bind mounts

the left operand is the file path of a directory on your local machine , the other operand is where that path will be mounted to in the containers file system

docker run -v /var/something/something:/var/container/something something


Sed

replace /bin/sh with /bin/bash for all files in a dir

sed -i 's/\#!\/bin\/sh/\#!\/bin\/bash/g' *


Oracle SBC

show all sip agents

sho sipd agents

show configuration for specified agent

sho configuration session-agent <AGENT-NAME> sh


TrueNAS

restart ssh service

midclt call service.restart "ssh"


Grep

grep for specific file extension

grep ".*\.md

Replace “md” with whichever extension you are trying to grep for.


Find

List files with specified extension

find . -name \*.md

Replace “.” with the directory you are searching in and replace “md” with the extension you are trying to search for.


System Clipboard

If you are using the X window system ,


Tar

Archive top level directories with tar

Use the ‘-C / xxx/xxx’

For example if you want to archive the /etc/network/interfaces file

sudo tar czf interfaces.tar -C / etc/network/interfaces

extract archive to specified directory

tar -xf archive.tar.xz -C / etc/something

if not root directory

` tar -xf archive.tar.xz -C /this/directory`

Restore backup from drive

tar --overwrite -xzvf backup.tar.gz --directory /


Unzip

unzip all zip files in directory

unzip \*.zip


Display Management

check what display manager you are using

On Debian/Ubuntu using X11 :

cat /etc/X11/default-display-manager

On Redhat :

cat /etc/sysconfig/desktop

check what compositor you are using

sudo apt install -y inxi

inxi -Gxx | grep compositor


Git

ignore vim swap files

Add this to your .gitignore

*~

Xorg

Make desktop shortcut for application

If you’re on GNOME , you can make a shortcut using the gnome-desktop-item-edit tool

gnome-desktop-item-edit ~/.local/share/applicationsj --create-new

You will need to do this if you would like the application to show up in the GNOME search menu.

Create a file for the shortcut located in /usr/share/applications. Create file with *.desktop extension

Use the template below to create your shortcut

Or you can do it manually by using this template for the *.desktop file

[Deskktop Entry]
Encoding=UTF-8
Version=1.0                                     # version of an app.
Name[en_US]=yEd                                 # name of an app.
GenericName=GUI Port Scanner                    # longer name of an app.
Exec=java -jar /opt/yed-3.11.1/yed.jar          # command used to launch an app.
Terminal=false                                  # whether an app requires to be run in a terminal.
Icon[en_US]=/opt/yed-3.11.1/icons/yicon32.png   # location of icon file.
Type=Application                                # type.
Categories=Application;Network;Security;        # categories in which this app should be listed.
Comment[en_US]=yEd Graph Editor                 # comment which appears as a tooltip.

disable sleep / suspend on xorg

Create the /etc/systemd/sleep.conf.d/nosuspend.conf file

Add these lines to the file

[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no


create /etc/X11/xorg.conf.d/10-extensions.conf

Then put this into the conf file

Section "Extensions"
    Option "DPMS" "false"
    EndSection

Rclone

copy files from source to dest

rlcone copy /source/dir mydrive:/drive/dir


Youtube downloading

download only the transcript

yt-dlp --verbose --skip-download --write-subs --write-auto-subs --sub-lang en --sub-format ttml --convert-subs srt --output "transcript.%(ext)s" <PUT-URL-HERE> && sed -i '' -e '/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9] --> [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]$/d' -e '/^[[:digit:]]\{1,3\}$/d' -e 's/<[^>]*>//g' ./transcript.en.srt && sed -e 's/<[^>]*>//g' -e '/^[[:space:]]*$/d' transcript.en.srt > output.txt && rm transcript.en.srt


FHS

This section is dedicated to my notes around the filsystem hierarchy standard that’s used widely among most linux distributions. These may contain pure info or snippets that may help me along with configuring a system and knowing where to allocate certain files. Each section will be divided by the named directory.

/home

See the snippet below :

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi