I define a function in .bash_aliases file and include it in my .bashrc file.

My .bash_aliases file:

function dmidecode() {
        if [[ $1 == -t && $2 == 1 ]]; then
                cat ~/some_file
                command dmidecode "$@"

The function is: when someone executes the command: dmidecode -t 1, bash reads the content from ~/some_file and return.

My .bashrc file:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion

It works when I interactively execute the command by typing the command in the bash shell. However, it doesn't work when I tried to execute it remotely. It said dmidecode command not found (I didn't install dmidecode tool but I write a function to point it to somewhere.). The remote connection is good because I can remotely execute commands like ls or pwd. It just doesn't work for the functions that I wrote.

And I tried to put shopt -s expand_aliases in the .bashrc file. It doesn't solve the problem also.

FYI, here is my test code for remote command execution:

from paramiko import client

class ssh:
    client = None

    def __init__(self, address, username, password, port=22):
        print("Connecting to server.")
        self.client = client.SSHClient()
        self.client.connect(address, port, username=username, password=password, look_for_keys=False)

    def sendCommand(self, command):
            stdin, stdout, stderr = self.client.exec_command(command)
            while not stdout.channel.exit_status_ready():
                # Print data when available
                if stdout.channel.recv_ready():
                    alldata = stdout.channel.recv(1024)
                    prevdata = b"1"
                    while prevdata:
                        prevdata = stdout.channel.recv(1024)
                        alldata += prevdata

                    print(str(alldata, "utf8"))
            print("Connection not opened.")

def main():
    connection = ssh("my_ip", "username", "password", 22)
    connection.sendCommand("dmidecode -t 1") # this doesn't work, "dmidecode command not found"
    connection.sendCommand("pwd") # this works

if __name__ == "__main__":

In Python's paramiko, the exec_command() behaves equivalent to ssh host_ip command which is a non-interactive shell. But what's next? Any thought on how to solve the problem? Thanks in advance.

  • Is the user from the python script the same one as the one you are using when trying it manually? – sysfiend Oct 6 '18 at 9:21

Try using the full path to the dmidecode application in your .bash_aliases file

| improve this answer | |
  • There is no dmidecode installed in my machine. Nor a application exists. – dibugger Oct 5 '18 at 19:25

I can't speak to paramiko specifically, but ssh typically detects when a session is non-interactive and behaves differently; such as not loading certain files.

You might have to tell it to setup like an interactive or "login" session or maybe force allocation of a tty. Or maybe just load the file yourself before calling the function.

connection.sendCommand("source .bashrc && dmidecode -t 1")

Sourcing the file feels wrong and might have undesired side-effects depending on what else in it, but doing so might at least confirm that the issue is that the file is not getting loaded if it makes the alias work.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.