Skip to content

Instantly share code, notes, and snippets.

Last active July 7, 2024 12:44
Show Gist options
  • Save SanderTheDragon/1331397932abaa1d6fbbf63baed5f043 to your computer and use it in GitHub Desktop.
Save SanderTheDragon/1331397932abaa1d6fbbf63baed5f043 to your computer and use it in GitHub Desktop.
A shellscript to create a Postman .deb file, for simple installation on Debian-based Linux distro's. Also creates a .desktop file.

Postman Debian Package Builder


Simply run the one of the following commands in your terminal and it will download the latest Postman version, build a .deb package and ask you if you want to install it.

if you have curl:

curl | sh

If you do not have curl:

wget -O - | sh


This script is licensed under the MIT License.


  • pedzed: idea for this script
  • SanderTheDragon: initial script and updates


Building Problems
  • chrisbjr: missing -e in some shells
  • cyfrost: -e not working with direct command
  • fakhamatia: dpkg-deb not building with wrong permissions
Missing Dependencies
  • jveillet: gconf2
  • kagurazakakotori: libgtk2.0-0 and libcanberra-gtk-module
  • wirwolf: desktop-file-utils
Installation Problems
  • maxgalbu, R0nAk: desktop file not installing
Upstream Changes
  • emamut: changed icon path
  • mikiTesf: changed tarball name from Postman to postman
  • stillru: changed tarball name to one without version information
  • 0xjams: changed from GTK 2 to GTK 3


  • xlmnxp, cyfrost, Killea: direct curl command (at the top)
  • cyfrost: version check before building
  • n8eloy: -y flag for apt install
  • stillru: using date as version
  • 0xjams: support for ARM64
# SPDX-FileCopyrightText: 2017-2024 SanderTheDragon <>
# SPDX-License-Identifier: MIT
arch=$(dpkg --print-architecture)
echo "Detected architecture: $arch"
case "$arch" in
amd64) downloadURL="";;
arm64) downloadURL="";;
echo "Unsupported architecture: $arch"
curlExists=$(command -v curl)
echo "Testing Postman version"
if [ -z $curlExists ]; then
dateString=$(wget -S --spider $downloadURL 2>&1 | grep "Date" | awk -F ':' '{ print $2 }')
dateString=$(curl -sI $downloadURL 2>&1 | grep "date" | awk -F ':' '{ print $2 }')
targetName="postman-$(date --date="$dateString" "+%y-%j-%H").tar.gz"
versionMaj=$(echo "$targetName" | awk -F '.' '{ print $1 }' | awk -F '-' '{ print $2 }')
versionMin=$(echo "$targetName" | awk -F '.' '{ print $1 }' | awk -F '-' '{ print $3 }')
versionRev=$(echo "$targetName" | awk -F '.' '{ print $1 }' | awk -F '-' '{ print $4 }')
echo "Most recent Postman version V$version"
current=$(dpkg-query --showformat='${Version}' --show postman 2> /dev/null)
if [ $? -gt 0 ]; then
echo "Postman is not installed"
echo "Installed version V$current"
if [ "$current" = "$version" ]; then
echo "The most recent version of Postman is currently installed"
echo "Updating Postman to the latest version"
targetPWD="$(mktemp -d postman.XXXXXX)"
cd "$targetPWD"
echo "Downloading latest Postman tarball"
if [ -z $curlExists ]; then
wget -q --show-progress $downloadURL -O $targetName
curl -# $downloadURL -o $targetName
if [ $? -gt 0 ]; then
echo "Failed to download Postman tarball"
echo "Extracting Postman tarball"
tar -xf $targetName
if [ $? -gt 0 ]; then
echo "Failed to extract Postman tarball"
echo "Creating 'postman_$version' folder structure and files"
mkdir -m 0755 -p "postman_$version"
mkdir -m 0755 -p "postman_$version/usr/share/applications"
touch "postman_$version/usr/share/applications/Postman.desktop"
mkdir -m 0755 -p "postman_$version/usr/share/icons/hicolor/128x128/apps"
mkdir -m 0755 -p "postman_$version/opt/postman"
mkdir -m 0755 -p "postman_$version/DEBIAN"
touch "postman_$version/DEBIAN/control" "postman_$version/DEBIAN/postinst" "postman_$version/DEBIAN/prerm"
echo "Copying files"
cp "Postman/app/resources/app/assets/icon.png" "postman_$version/usr/share/icons/hicolor/128x128/apps/postman.png"
cp -R "Postman/"* "postman_$version/opt/postman/"
echo "Testing whether to use '-e'"
lines=$(echo "\n" | wc -l)
if [ $lines -eq 1 ]; then
echo "'-e' is required"
echo "'-e' is not required"
echo "Writing files"
echo $e "[Desktop Entry]\nType=Application\nName=Postman\nGenericName=Postman API Tester\nIcon=postman\nExec=postman\nPath=/opt/postman\nCategories=Development;" > "postman_$version/opt/postman/Postman.desktop"
echo $e "Package: Postman\nVersion: $version\nSection: devel\nPriority: optional\nArchitecture: $arch\nDepends: libgtk-3-0, desktop-file-utils\nMaintainer: You\nDescription: Postman\n API something" > "postman_$version/DEBIAN/control"
echo $e "if [ -f \"/usr/bin/postman\" ]; then\n\tsudo rm -f \"/usr/bin/postman\"\nfi\n\nsudo ln -s \"/opt/postman/Postman\" \"/usr/bin/postman\"\n\ndesktop-file-install \"/opt/postman/Postman.desktop\"" > "postman_$version/DEBIAN/postinst"
echo $e "if [ -f \"/usr/bin/postman\" ]; then\n\tsudo rm -f \"/usr/bin/postman\"\nfi" > "postman_$version/DEBIAN/prerm"
echo "Setting modes"
chmod 0775 "postman_$version/usr/share/applications/Postman.desktop"
chmod 0775 "postman_$version/DEBIAN/control"
chmod 0775 "postman_$version/DEBIAN/postinst"
chmod 0775 "postman_$version/DEBIAN/prerm"
echo "Validating modes"
if [ $(stat -c "%a" "postman_$version/DEBIAN/control") != "775" ]; then
echo "File modes are invalid, calling 'dpkg-deb' with '--nocheck'"
echo "File modes are valid"
echo "Building 'postman_$version.deb'"
dpkg-deb $nc -b "postman_$version" > /dev/null
if [ $? -gt 0 ]; then
echo "Failed to build 'postman_$version.deb'"
mv "postman_$version.deb" "$originalPWD"
cd "$originalPWD"
echo "Cleaning up"
rm -rf "$targetPWD"
while true; do
read -p "Do you want to install 'postman_$version.deb' [Y/n] " yn
if [ -z $yn ]; then
case $yn in
[Yy]* ) break;;
[Nn]* ) exit;;
echo "Installing"
sudo apt install -y "./postman_$version.deb"
if [ $? -gt 0 ]; then
echo "Failed to install 'postman_$version.deb'"
echo "Removing 'postman_$version.deb'"
rm -f "postman_$version.deb"
Copy link

@stillru That is a very good idea, and it is probably the best way, thanks! :D
I edited it a bit to use a different scheme, day of year looks nicer in my opinion and hour could be useful.
Also PRs do not exist for gists, but I added you (and everyone else who helped in one way or another) to the new contributors part of the README.

Other than that:

  • targetName is now actually used as target name
  • I fixed the issue where dpkg-deb complains about the Optional field
  • I added licensing information (MIT), which could be useful

I hope everything will work now : )

Copy link

I hope everything will work now : )

Yes, thank you its work but in end show a warning:

$ ./
Unpacking postman (22.223-09) ...
Setting up gconf2 (3.2.6-7ubuntu2) ...
Setting up postman (22.223-09) ...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for desktop-file-utils (0.26-1ubuntu3) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu3) ...
Processing triggers for man-db (2.10.2-1) ...
ZSys is adding automatic system snapshot to GRUB menu
N: Download is performed unsandboxed as root as file '/Postman/Downloader/postman_22.223-09.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
Removing 'postman_22.223-09.deb'

Copy link

@fakhamatia I don't get that message on my system (Debian Testing), but it looks like it is caused by the fact that the download and build is done by your current user instead of the _apt user. And in my opinion the build should be done by the current user.

I could add a check to see if the _apt user exists and chown the package if it does. But since the install succeeds and the loglevel is notice, I think the best way for now is to just ignore it.

Copy link

MBM1607 commented Sep 17, 2022

Thanks a lot @SanderTheDragon !

Copy link

Thanks a lot @SanderTheDragon this script really helpful, it works on pop os 22.04, should work on ubuntu and linux mint version too!

Copy link

dxdns commented Jan 12, 2023

At the end this message appears:
N: Download is performed unsandboxed as root as file '/Postman/Downloader/postman_22.223-09.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
Removing 'postman_22.223-09.deb'

But it worked on linux mint. Thanks

Copy link

Thank you @SanderTheDragon. I'm find postman fix cursor very long until I found it this repo.

Copy link

0xjams commented Apr 2, 2024

I added a check so that it downloads the right version depending on the architecture. I also removed gconf2 as a dependency, and it seemed to work just fine.

Copy link

@0xjams Thanks for these improvements!

I moved the architecture check to the top, so the date/version is checked for the correct architecture (I would expect that they are the same, but just to be sure).
I also checked the dependencies, and it seems like it now depends on GTK 3 instead of GTK 2, so gconf2 is not needed anymore.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment