> For the complete documentation index, see [llms.txt](https://sh.howtocode.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sh.howtocode.dev/3.0.0.part3intro/3.4.0.networking/3.4.3.secure-connection.md).

# নিরাপদ যোগাযোগ

একটি কম্পিউটারকে দূরবর্তী আরেকটি কম্পিউটার দিয়ে নিয়ন্ত্রণ করা ইউনিক্স সিস্টেমের জন্য নতুন কোনো ব্যাপার না। আগে এই কাজে rlogin বা telnet ব্যবহৃত হত। কিন্তু সমস্যা হচ্ছে যে, এগুলো এফটিপির মত প্লেইনটেক্সটে ডাটা ট্রান্সফার করত। যার ফলে এগুলো ইন্টারনেটের ভিতরে ব্যবহার করা অনিরাপদ হয়ে উঠল।

## ssh

এই সমস্যা থেকে সমাধান দিল ssh বা secure shell। এই প্রযুক্তির দুটো অংশ। একটি হল ssh server অন্যটি ssh client।

### ssh সার্ভার তৈরী

এর জন্য আমরা প্রথমে openssh-server প্যাকেজটি ইন্সটল করবো। এবার আমরা কনফিগার করবো। কনফিগার করতে আমাদের /etc/ssh/sshd\_config ফাইলটি এডিট করতে হবে।। এর জন্য আমরা এর একটি ব্যাকআপ রাখবো এভাবে:

```
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults
```

এবার ন্যানো, ভিম বা ইম্যাকস্ দিয়ে ফাইলটি রুটমোডে খুলবো:

```
# emacs -nw cp /etc/ssh/ssh_config
```

ফাইলে যেসব লাইনগুলো # দিয়ে শুরু সেগুলো কমেন্ট। আমরা একলাইনে দেখতে পাচ্ছি:

```
Port 22
```

এটি ssh এর ডিফল্ট পোর্ট। এজন্য ব্যবহার করাও অনিরাপদ। আমরা এটিকে 365 তে পরিবর্তিত করতে এডিট করে এটি লিখবো:

```
Port 365
```

এবার আমরা সেভ করে বন্ধ করতে পারি।

এরপর আমরা ssh সার্ভার রিস্টার্ট দেবো এভাবে:

```
# /etc/init.d/ssh restart
```

### ssh লগইন

লগইন করতে আপনাকে সার্ভারের হোস্টনেম জানতে হবে। আপনার কম্পিউটারে আপনি নিজে localhost ব্যবহার করে ঢুকতে পারেন। লোক্যাল নেটওয়ার্কের অন্য কম্পিউটারের হোস্টনেম ব্যবহার করে ঢুকতে পারেন। ইন্টারনেটের ক্ষেত্রে হয় আপনাকে তার ওয়েব এড্রেস অথবা আইপি এড্রেস জানতে হবে।

আমরা অধিকাংশই ডেডিকেটেড আইপি ব্যবহার করিনা। ফলে প্রত্যেক কানেকশনের সময় আইপি বদলায়। তাই আমাদের আইপি জানতে হবে যখন রিমোটলি এক্সেস করতে চাই। ধরুন, আমি চাই কাউকে আমার কম্পিউটারে এক্সেস দিতে। তাহলে আমি তাকে পাবলিক আইপি জানাবো। এটা জানতে এই কমান্ডটি দিতে পারি:

```
curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
```

আপনি এটি alias করে রাখতে পারেন।

এখন আমি আমার কম্পিউটারে যুক্ত হবো। me নামের একজন ইউজার হিসেবে। আমরা যেহেতু ডিফল্ট পোর্টটি ব্যবহার না করে 365 ব্যবহার করছি তাই আমাদের কমান্ড হবে:

```
me@howtocode-pc:~$ ssh -p 365 me@localhost
```

আমরা -p অপশন দিয়ে port লিখেছি। তারপর me\@localhost দিয়ে localhost এর me এর সাথে যোগাযোগ করছি। এরপর আমরা এমনকিছু দেখতে পাবো:

```
The authenticity of host '[localhost]:365 ([127.0.0.1]:365)' can't be established.
ECDSA key fingerprint is 22:a4:cf:1a:e3:d9:3f:ae:fa:ca:ab:8b:5a:8e:64:01.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:365' (ECDSA) to the list of known hosts.
me@localhost's password: 
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-48-generic x86_64)

 * Documentation:  https://help.ubuntu.com/


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

me@howtocode-pc:~$ exit
logout
Connection to localhost closed.
```

প্রথমবার লগিনের সময় অথেনটিকেট করা সম্ভব হয়না। তারবদলে একটি ফিঙ্গারপ্রিন্ট দেখায়। এটি যদি ঠিক থাকে তাহলে আপনি yes লিখে এন্টার দেবেন। ফিঙ্গারপ্রিন্ট আপনাকে সার্ভারের এডমিনিস্ট্রেটর সরবরাহ করবে। তারপর আপনাকে me ইউজারের পাসওয়ার্ড দিতে হবে। সঠিকভাবে দিলে আপনাকে প্রম্পট দিবে। তখন আপনি সাধারণ টার্মিনালের মতই কাজ করতে পারবেন। সেশন বন্ধ করতে `exit` লিখে এন্টার দেবেন।

### ssh-key এর মাধ্যমে লগইন

লগইনের আরেকটি উপায় হল ssh key তৈরী করা। এর দুটি অংশ। একটি পাবলিক কী, অন্যটি প্রাইভেট। ইউজার তথ্য প্রাইভেট কী দিয়ে এনক্রিপ্ট করে দিলে সেটি পাবলিক কী দিয়ে ডিক্রিপ্ট করা যায়। কিন্তু তার পরিবর্তন করা যায় না। এজন্য এটি বহুলব্যবহৃত একটি ব্যবস্থা। এজন্য আপনাকে একজোড়া কী জেনারেট করতে হবে। কী জেনারেট করতে পারেন এভাবে:

```
me@howtocode-pc:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/me/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/me/.ssh/id_rsa.
Your public key has been saved in /home/me/.ssh/id_rsa.pub.
The key fingerprint is:
be:eb:32:90:38:74:1a:65:b8:83:3a:64:7d:b1:84:33 me@howtocode-pc
The key's randomart image is:
+--[ RSA 2048]----+
|   ..            |
|  .Eoo           |
| ..++ o          |
|.o=..o           |
|+. *..  S        |
|o + o  .         |
| . . .  .        |
|      o  .       |
|       ++.       |
+-----------------+
```

আপনি `ssh-keygen` কমান্ডটি দিলে প্রথমে জিজ্ঞাসা করবে কোন ফাইলে সেভ করবে। আপনি ডিফল্টটি সিলেক্ট করতে এন্টার চাপুন। এরপর পাসফ্রেজ/পাসওয়ার্ড দিতে বলবে আপনি নতুন একটি পাসফ্রেজ দুবার দিলে কী তৈরী হবে।

এবার আপনি নতুন তৈরী কী সিস্টেমে যোগ করবেন এভাবে:

```
me@howtocode-pc:~$ ssh-add
Enter passphrase for /home/me/.ssh/id_rsa: 
Identity added: /home/me/.ssh/id_rsa (/home/me/.ssh/id_rsa)
```

`ssh-add` কমান্ডটি দেওয়ার পর পাসফ্রেজ জানতে চাইবে। সঠিক পাসফ্রেজ দিলে কীটি যুক্ত হবে।

এবার আপনার পাবলিক কীটি সার্ভারে পাঠানোর পালা। এটি করবেন এভাবে:

```
me@howtocode-pc:~$ ssh-copy-id -p 365 -i me@localhost
```

এরপর আপনি যে ইউজার হিসেবে লগিন করছেন তার পাসওয়ার্ড জিজ্ঞাসা করবে। সঠিক পাসওয়ার্ড দুলে কীটি যুক্ত হবে। এরপর থেকে লগিনের সময় আর কোনোরকমের অথেটিকেশনের দরকার হবে না।

কখনো কখনো এমনও হতে পারে যে আপনি মাত্র একটা কমান্ড দিতে চাচ্ছেন রিমোটলি। তার জন্য পুরো লগইন এর প্রয়োজন নেই। যেমন আমরা যদি রিমোট কম্পিউটারের র‍্যাম ও সোয়াপ সম্পর্কিত তথ্য জানতে \`free কমান্ডটি ব্যবহার করতে চাই তাহলে সেটি করতে পারি এভাবে:

```
me@howtocode-pc:~$ ssh -p 365 me@localhost free
             total       used       free     shared    buffers     cached
Mem:       3915316    1607456    2307860     182148     150292     670024
-/+ buffers/cache:     787140    3128176
Swap:      2097148          0    2097148
```

আবার আমরা যদি চাই এই কমান্ডের আউটপুট আমাদের লোকাল কম্পিউটারে `memlog.txt` ফাইলে রিডিরেক্ট করতে চাই তাজলে লিখবো:

```
me@howtocode-pc:~$ ssh -p 365 me@localhost 'free' > memlog.txt
```

এখানে `free` কে **''** আবদ্ধ করা জরুরি। এরকমক্ষেত্রে আবদ্ধ অংশটুকু রিমোট কম্পিউটারে এবং আবদ্ধ নয় এমন অংশ লোকাল কম্পিউটারে কাজ করবে। অতএব আমরা যদি memlog.txt কে 'memlog.txt' লিখতাম তাহলে টেক্সটফাইলটি রিমোট কম্পিউটারে তৈরী হত।

### scp ও sftp

`scp` অনেকটা `cp` কমান্ডের মতই তবে এটি রিমোটলি কাজ করতে পারে। অর্থাৎ আপনি যদি লোকাল কম্পিউটারের সাথে রিমোট কম্পিউটারে তথ্য আদানপ্রদান করতে চান তাহলে এটি ব্যবহার করতে পারেন। নীচে দুটি উদাহরণ দেওয়া হল:

```
me@howtocode-pc:~$ scp -P 365 to_remote.txt me@localhost:./
to_remote.txt                                   100%  331     0.3KB/s   00:00
me@howtocode-pc:~$ scp -P 365 me@localhost:from_remote.txt ./
from_remote.txt                                 100%  331     0.3KB/s   00:00
```

প্রথম উদাহরণে আমরা লোকাল কম্পিউটারের হোম থেকে `to_remote.txt` ফাইলটি রিমোট কম্পিউটারের হোমে কপি করেছি। দ্বিতীয় উদাহরণে `from_remote.txt` ফাইলটি রিমোট থেকে লোকাল কম্পিউটারে। রিমোট কম্পিউটারের ফাইল বোঝাতে আমরা `me@localhost:` প্রেফিক্স ব্যবহার করছি।

`ssh` এর আরেকটি ফিচার হচ্ছে `sftp` অর্থাৎ সিকিউর এফটিপি। এটি এফটিপির মতই তবে নিরাপদ। আমরা রিমোট কম্পিউটারে `sftp` দিয়ে যোগাযোগ করতে পারি এভাবে:

```
me@howtocode-pc:~$ sftp -P 365 utsargo@localhost 
Connected to localhost.
sftp>
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sh.howtocode.dev/3.0.0.part3intro/3.4.0.networking/3.4.3.secure-connection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
