SNAP_* env variables pollute the IDE's environment

Scenario: We are working on a python project which is supposed to be packaged as a snap and will be published to pypi as well. We rely on the existence of $SNAP environment variable to differentiate if the code is running from within a snap or not. W also make use of $SNAP_USER_DATA for saving/accessing a database for app configurations.

Problem: If the IDE/Editor is a snap (pycharm-professional in this case) and we try to run the app from within it during development, the snap code path is run as the IDE itself have those variables ($SNAP and $SNAP_USER_DATA) in its environment.

Below is the output of env command in terminal

CLUTTER_IM_MODULE=xim
LC_ALL=en_US.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
LC_MEASUREMENT=ur_PK
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_PAPER=ur_PK
LC_MONETARY=ur_PK
XDG_MENU_PREFIX=gnome-
LANG=en_US.UTF-8
DISPLAY=:0
OLDPWD=/home/om26er/code/crossbario/xbr/xbr-dashboard
GNOME_SHELL_SESSION_MODE=ubuntu
COLORTERM=truecolor
USERNAME=om26er
XDG_VTNR=2
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
VIRTUAL_ENV=/home/om26er/code/crossbario/pyside2/env
LC_NAME=ur_PK
XDG_SESSION_ID=2
USER=om26er
DESKTOP_SESSION=ubuntu
QT4_IM_MODULE=xim
TEXTDOMAINDIR=/usr/share/locale/
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/4fcd0aa7_1251_4b5a_85d6_15ee2305eeb8
PWD=/home/om26er/code/crossbario/xbr/xbr-dashboard/work/qt5
HOME=/home/om26er
TEXTDOMAIN=im-config
SSH_AGENT_PID=2587
QT_ACCESSIBILITY=1
XDG_SESSION_TYPE=x11
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_SESSION_DESKTOP=ubuntu
LC_ADDRESS=ur_PK
GJS_DEBUG_OUTPUT=stderr
LC_NUMERIC=ur_PK
GTK_MODULES=gail:atk-bridge
WINDOWPATH=2
VTE_VERSION=5202
TERM=xterm-256color
SHELL=/bin/bash
QT_IM_MODULE=ibus
XMODIFIERS=@im=ibus
IM_CONFIG_PHASE=2
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GNOME_TERMINAL_SERVICE=:1.69
XDG_SEAT=seat0
SHLVL=1
LC_TELEPHONE=ur_PK
GDMSESSION=ubuntu
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=om26er
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/run/user/1000/gdm/Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
PATH=/home/om26er/code/crossbario/pyside2/env/bin:/home/om26er/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/var/lib/snapd/snap/bin
LC_IDENTIFICATION=ur_PK
PS1=(env) \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
SESSION_MANAGER=local/Intel-NUC:@/tmp/.ICE-unix/2477,unix/Intel-NUC:/tmp/.ICE-unix/2477
LESSOPEN=| /usr/bin/lesspipe %s
GTK_IM_MODULE=ibus
LC_TIME=ur_PK
_=/usr/bin/env

And here is what my IDE sees, since its a snap.

CLUTTER_IM_MODULE=xim
SNAP_INSTANCE_USER_COMMON=/home/om26er/snap/pycharm-professional/common
LC_ALL=en_US.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
LC_MEASUREMENT=ur_PK
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_PAPER=ur_PK
LC_MONETARY=ur_PK
XDG_MENU_PREFIX=gnome-
SNAP_USER_DATA=/home/om26er/snap/pycharm-professional/89
LANG=en_US.UTF-8
DISPLAY=:0
OLDPWD=/snap/pycharm-professional/89/bin
GNOME_SHELL_SESSION_MODE=ubuntu
SNAP_REVISION=89
SNAP_ARCH=amd64
USERNAME=om26er
XDG_VTNR=2
GIO_LAUNCHED_DESKTOP_FILE_PID=3202
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
VIRTUAL_ENV=/home/om26er/code/crossbario/pyside2/env
LC_NAME=ur_PK
XDG_SESSION_ID=2
SNAP_USER_COMMON=/home/om26er/snap/pycharm-professional/common
USER=om26er
DESKTOP_SESSION=ubuntu
QT4_IM_MODULE=xim
TEXTDOMAINDIR=/usr/share/locale/
PWD=/home/om26er/code/crossbario/xbr/xbr-dashboard/work/qt5
HOME=/home/om26er
TEXTDOMAIN=im-config
SNAP_INSTANCE=/snap/pycharm-professional/89
SNAP=/snap/pycharm-professional/89
SNAP_INSTANCE_USER_DATA=/home/om26er/snap/pycharm-professional/89
SSH_AGENT_PID=2587
SNAP_INSTANCE_DATA=/var/snap/pycharm-professional/89
QT_ACCESSIBILITY=1
SNAP_COMMON=/var/snap/pycharm-professional/common
XDG_SESSION_TYPE=x11
SNAP_NAME=pycharm-professional
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
SNAP_INSTANCE_NAME=pycharm-professional
SNAP_DATA=/var/snap/pycharm-professional/89
XDG_SESSION_DESKTOP=ubuntu
LC_ADDRESS=ur_PK
GJS_DEBUG_OUTPUT=stderr
LC_NUMERIC=ur_PK
SNAP_INSTANCE_COMMON=/var/snap/pycharm-professional/common
GTK_MODULES=gail:atk-bridge
SNAP_COOKIE=6FGFrm3S2L2kLfs8WSFYKC6fbSDGpjvbdvgNc24sg6Lp
WINDOWPATH=2
TERM=xterm-256color
SHELL=/bin/bash
QT_IM_MODULE=ibus
XMODIFIERS=@im=ibus
IM_CONFIG_PHASE=2
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-professional_pycharm-professional.desktop
SNAP_REEXEC=
GIO_LAUNCHED_DESKTOP_FILE=/var/lib/snapd/desktop/applications/pycharm-professional_pycharm-professional.desktop
XDG_SEAT=seat0
SHLVL=1
LC_TELEPHONE=ur_PK
GDMSESSION=ubuntu
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=om26er
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000/snap.pycharm-professional
XAUTHORITY=/run/user/1000/gdm/Xauthority
SNAP_CONTEXT=6FGFrm3S2L2kLfs8WSFYKC6fbSDGpjvbdvgNc24sg6Lp
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
PATH=/home/om26er/code/crossbario/pyside2/env/bin:/home/om26er/.local/bin:/home/om26er/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/var/lib/snapd/snap/bin:/snap/bin:/var/lib/snapd/snap/bin:/snap/bin:/var/lib/snapd/snap/bin
LC_IDENTIFICATION=ur_PK
PS1=(env) \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 
SNAP_VERSION=2018.2.4
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:/var/lib/snapd/lib/gl32:/var/lib/snapd/void
SESSION_MANAGER=local/Intel-NUC:@/tmp/.ICE-unix/2477,unix/Intel-NUC:/tmp/.ICE-unix/2477
LESSOPEN=| /usr/bin/lesspipe %s
GTK_IM_MODULE=ibus
LC_TIME=ur_PK
BASH_FUNC_generate_command_executed_sequence%%=() {  printf '\e\7'
}
_=/usr/bin/env
  • As an end user there’s not much you can do about this.
  • As a snap packager only (you don’t develop the application) this is also not changeable by you.
  • As a application developer, however, you can ensure that sub-processes you start have a clean/sanitized environment using the mechanisms provided by the language you wrote your application in. You need to either create a new empty environment, or copy your application’s environment removing any variables you don’t want to be exposed to sub-processes, and hand that off to your programming language’s sub-process execution mechanism.
1 Like

You might have missed the actual problem. The issue occurs when a developer is working on the code and running it through their IDE, mostly to test a change they just made. Currently, what I do is run my program from gnome terminal instead of just clicking the “play” button within the IDE, because if run from within the IDE my app thinks its running as a snap as I differentiate the environment based on the availability of the $SNAP variable.

In my case I could probably add another condition to check if $SNAP is exported in the environment and then check if $SNAP_NAME equals to what I named my name in its .yaml file.

But it would probably be better to have a solution at a different level like snapd (if possible) or recommendation to IDE developers on what to change.

I perfectly understood the problem. I was talking about the IDE sanitizing the environment, not the application being developed in the IDE.