<div dir="ltr">I proposed this as a solution many moons ago, but didn't follow up with any extra details. I have this patched on my own local, but I'd probably change it to count from 1 instead of 0.<div>"</div><div><div style="font-size:12.8px"><div><div><div>Hello everyone,<br></div>Up for discussion, it would be useful to allow extraction from <span class="gmail-il">pass</span> a selection of character indexes.<br></div>My use case is where some providers (i.e banks) want character 0, 3, 5 from a password. I modify the show command to accept --index(-i)<br></div>  i.e show -i0,3,5 for the password p@ssword would output 'p s o'<br><br></div><div style="font-size:12.8px">Attached is an initial patch, all feedback welcome :)<br></div><div style="font-size:12.8px"><br><br>diff --git a/src/password-store.sh b/src/password-store.sh<br>index d77ff12..bcc8d62 100755<br>--- a/src/password-store.sh<br>+++ b/src/password-store.sh<br>@@ -263,8 +263,8 @@ cmd_usage() {<br>             List passwords.<br>         $PROGRAM find <span class="gmail-il">pass</span>-names...<br>             List passwords that match <span class="gmail-il">pass</span>-names.<br>-        $PROGRAM [show] [--clip[=line-number],-c[line-<wbr>number]] <span class="gmail-il">pass</span>-name<br>-            Show existing password and optionally put it on the clipboard.<br>+        $PROGRAM [show] [--clip[=line-number],-c[line-<wbr>number]],[--index[=indexes],-<wbr>i[=indexes] <span class="gmail-il">pass</span>-name<br>+            Show existing password, optionally put it on the clipboard, optionally extract out character indexes (i.e -i0,3,5).<br>             If put on the clipboard, it will be cleared in $CLIP_TIME seconds.<br>         $PROGRAM grep search-string<br>             Search for password files containing search-string when decrypted.<br>@@ -346,26 +346,33 @@ cmd_init() {<br><br> cmd_show() {<br>     local opts selected_line clip=0 qrcode=0<br>-    opts="$($GETOPT -o q::c:: -l qrcode::,clip:: -n "$PROGRAM" -- "$@")"<br>+    opts="$($GETOPT -o q::c::i:: -l qrcode::,clip::,index:: -n "$PROGRAM" -- "$@")"<br>     local err=$?<br>     eval set -- "$opts"<br>     while true; do case $1 in<br>         -q|--qrcode) qrcode=1; selected_line="${2:-1}"; shift 2 ;;<br>         -c|--clip) clip=1; selected_line="${2:-1}"; shift 2 ;;<br>+        -i|--index) index=1; _=$IFS IFS="," indexes=(${2:-1}) IFS=$_; shift 2 ;;<br>         --) shift; break ;;<br>     esac done<br><br>-    [[ $err -ne 0 || ( $qrcode -eq 1 && $clip -eq 1 ) ]] && die "Usage: $PROGRAM $COMMAND [--clip[=line-number],-c[line-<wbr>number]] [--qrcode[=line-number],-q[<wbr>line-number]] [<span class="gmail-il">pass</span>-name]"<br>+    [[ $err -ne 0 || ( $qrcode -eq 1 && $clip -eq 1 ) ]] && die "Usage: $PROGRAM $COMMAND [--clip[=line-number],-c[line-<wbr>number]],[--index=[character-<wbr>indexes],-i[character-indexes] [--qrcode[=line-number],-q[<wbr>line-number]] [<span class="gmail-il">pass</span>-name]"<br><br>     local path="$1"<br>     local passfile="$PREFIX/$path.gpg"<br>     check_sneaky_paths "$path"<br>     if [[ -f $passfile ]]; then<br>+        local <span class="gmail-il">pass</span>=`$GPG -d "${GPG_OPTS[@]}" "$passfile"`<br>+<br>+        if [[ $index -eq 1 ]]; then<br>+            <span class="gmail-il">pass</span>=$(for i in ${indexes[*]}; do echo ${<span class="gmail-il">pass</span>:i:1}; done) || exit $?<br>+        fi<br>         if [[ $clip -eq 0 && $qrcode -eq 0 ]]; then<br>-            $GPG -d "${GPG_OPTS[@]}" "$passfile" || exit $?<br>+            [[ -n $<span class="gmail-il">pass</span> ]] || exit $?<br>+            echo $<span class="gmail-il">pass</span><br>         else<br>             [[ $selected_line =~ ^[0-9]+$ ]] || die "Clip location '$selected_line' is not a number."<br>-            local <span class="gmail-il">pass</span>="$($GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n +${selected_line} | head -n 1)"<br>+            <span class="gmail-il">pass</span>="$(echo $<span class="gmail-il">pass</span> | tail -n +${selected_line} | head -n 1)"<br>             [[ -n $<span class="gmail-il">pass</span> ]] || die "There is no password to put on the clipboard at line ${selected_line}."<br>             if [[ $clip -eq 1 ]]; then<br>                 clip "$<span class="gmail-il">pass</span>" "$path"<br>diff --git a/tests/t0020-show-tests.sh b/tests/t0020-show-tests.sh<br>index a4b782f..c005c7d 100755<br>--- a/tests/t0020-show-tests.sh<br>+++ b/tests/t0020-show-tests.sh<br>@@ -19,4 +19,24 @@ test_expect_success 'Test "show" of nonexistant password' '<br>     test_must_fail "$<span class="gmail-il">PASS</span>" show cred2<br> '<br><br>+test_expect_success 'Test "show" of single character' '<br>+    "$<span class="gmail-il">PASS</span>" insert -e "cred3"<<<"p@ssword!" &&<br>+    [[ $("$<span class="gmail-il">PASS</span>" show -i1 cred3) == "@" ]]<br>+'<br>+<br>+test_expect_success 'Test "show" of first character' '<br>+    "$<span class="gmail-il">PASS</span>" insert -e "cred3"<<<"p@ssword!" &&<br>+    [[ $("$<span class="gmail-il">PASS</span>" show -i0 cred3) == "p" ]]<br>+'<br>+<br>+test_expect_success 'Test "show" of last character' '<br>+    "$<span class="gmail-il">PASS</span>" insert -e "cred3"<<<"p@ssword!" &&<br>+    [[ $("$<span class="gmail-il">PASS</span>" show -i8 cred3) == "!" ]]<br>+'<br>+<br>+test_expect_success 'Test "show" of multiple characters' '<br>+    "$<span class="gmail-il">PASS</span>" insert -e "cred3"<<<"p@ssword!" &&<br>+    [[ $("$<span class="gmail-il">PASS</span>" show -i1,5 cred3) == "@ o" ]]<br>+'<br>+<br> test_done</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">"</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 29, 2018 at 11:54 AM, Kjetil Torgrim Homme <span dir="ltr"><<a href="mailto:kjetil.homme@redpill-linpro.com" target="_blank">kjetil.homme@redpill-linpro.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 06/29/2018 12:51 PM, Ben Oliver wrote:<br>
> On 18-06-29 11:37:04, Steve Harriss wrote:<br>
>> Is there any value in enabling pass to get just 3, or more, specific<br>
>> characters from a password and just displaying them?<br>
>><br>
>> A lot of banking sites now ask for specific numbered characters and,<br>
>> in a longer password it can be challenging to get the 6th, 12th and 18th.<br>
> <br>
> I have this exact use case too. Would be cool to be able to do this.<br>
> <br>
> Out of interest, what would be the best way of doing it on the CLI anyway?<br>
<br>
</div></div>I've never seen this security "feature", but you use cut(1) to do this<br>
<br>
  $ echo 1234567890 | cut -c2,4,7-9<br>
  24789<br>
<span class="HOEnZb"><font color="#888888"><br>
-- <br>
Kjetil T. Homme<br>
Redpill Linpro AS - Changing the game<br>
<br>
</font></span><br>______________________________<wbr>_________________<br>
Password-Store mailing list<br>
<a href="mailto:Password-Store@lists.zx2c4.com">Password-Store@lists.zx2c4.com</a><br>
<a href="https://lists.zx2c4.com/mailman/listinfo/password-store" rel="noreferrer" target="_blank">https://lists.zx2c4.com/<wbr>mailman/listinfo/password-<wbr>store</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Peter Brooks<br></div>
</div>