---
title: Patch for the CLI password manager „pass“
type: post
author: micha
date: 2016-05-25T21:47:20+00:00
url: /patch-for-the-cli-password-manager-pass/
tags:
 - Software
 - CLI
---
I use Pass (https://www.passwordstore.org/) to store and synchronize all my passwords.

When I use Pass via SSH on a remote system in order to retrieve a password, I cannot make use of it's clipboard feature. In order to output the password without actually displaying it, I wrote the following patch which prints the password in red on a red background while still being able to be manually copied to the clipboard:

```
 src/password-store.sh | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/password-store.sh b/src/password-store.sh
index d535a74..f4e1cfe 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -223,8 +223,8 @@ cmd_usage() {
             List passwords.
         $PROGRAM find pass-names...
             List passwords that match pass-names.
-        $PROGRAM [show] [--clip,-c] pass-name
-            Show existing password and optionally put it on the clipboard.
+        $PROGRAM [show] [--clip,-c] [--hidden,-h] pass-name
+            Show existing password and optionally put it on the clipboard or hide it.
             If put on the clipboard, it will be cleared in $CLIP_TIME seconds.
         $PROGRAM grep search-string
             Search for password files containing search-string when decrypted.
@@ -294,23 +294,30 @@ cmd_init() {
 }

 cmd_show() {
-    local opts clip=0
-    opts="$($GETOPT -o c -l clip -n "$PROGRAM" -- "$@")"
+    local opts clip=0 hidden=0
+    opts="$($GETOPT -o ch -l clip,hidden -n "$PROGRAM" -- "$@")"
     local err=$?
     eval set -- "$opts"
     while true; do case $1 in
         -c|--clip) clip=1; shift ;;
+        -h|--hidden) hidden=1; shift ;;
         --) shift; break ;;
     esac done

-    [[ $err -ne 0 ]] && die "Usage: $PROGRAM $COMMAND [--clip,-c] [pass-name]"
+    [[ $err -ne 0 ]] && die "Usage: $PROGRAM $COMMAND [--clip,-c] [--hidden,-h] [pass-name]"

     local path="$1"
     local passfile="$PREFIX/$path.gpg"
     check_sneaky_paths "$path"
     if [[ -f $passfile ]]; then
         if [[ $clip -eq 0 ]]; then
-            $GPG -d "${GPG_OPTS[@]}" "$passfile" || exit $?
+            if [[ $hidden -eq 0 ]]; then
+                $GPG -d "${GPG_OPTS[@]}" "$passfile" || exit $?
+                       else
+                local pass="$($GPG -d "${GPG_OPTS[@]}" "$passfile" | head -n 1)"
+                [[ -n $pass ]] || exit 1
+                               echo -e "\e[0;31;41m$pass\e[0m"
+                       fi
         else
             local pass="$($GPG -d "${GPG_OPTS[@]}" "$passfile" | head -n 1)"
             [[ -n $pass ]] || exit 1
```
